如何判断一个字符串的内容是一个数值?

look_think 2003-01-27 11:39:00
包括科学计数法。
...全文
163 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pf_ma 2003-01-29
  • 打赏
  • 举报
回复
我在我的Postscript Filter中是用状态矩阵来分析字符串,但
对字符串的上溢,下溢的处理还,没有考虑好,我认为下溢应该
置0.0,上溢时应该报错。
atof()上溢、下溢时都返回一个非法的double值。
vyc 2003-01-29
  • 打赏
  • 举报
回复
干嘛非要自己写,用IO流不好吗??
look_think 2003-01-28
  • 打赏
  • 举报
回复
想出一个算法,抛砖引玉
1、字符串必须由以下字符组成:半角阿拉伯数字、大小写E、正负号、小数点
2、如果有大小写E
截取E前内容,必须是个合法的自然数字
如果E不是字符串的最后一个字符,读取E后的内容。E后第一个字符必须是正号或者负号,且后面必须还有内容。
截取符号后面的部分,必须是一个合法正整数
3、如果没有大小写E,看是否是个合法的自然数字
Frank001 2003-01-28
  • 打赏
  • 举报
回复
同意Cybergate(void) 的看法,
不同的环境和要求下,方法也不尽一样。
liuxiyu 2003-01-28
  • 打赏
  • 举报
回复
如果非要自己写, look_think(look) 的思路是可以实现的
pf_ma 2003-01-28
  • 打赏
  • 举报
回复
to allen1981813:
不能判断科学计数法,不能判断多个小数点
allen1981813 2003-01-28
  • 打赏
  • 举报
回复
int digit=1;
for(char *p=s;*p;p++)
if((*p>'a'&& *p<'z')||(*p>'A'&&*p<'Z'))
{ flag=0;break;}
if(!flag) cout<<"it is string";
else cout<<"digit"

pf_ma 2003-01-28
  • 打赏
  • 举报
回复

可以使用状态矩阵来分析字符串

我是从编译原理的书上看来的;-)



zalyer 2003-01-28
  • 打赏
  • 举报
回复
大家说的有道理,支持!!!!!!
wos 2003-01-28
  • 打赏
  • 举报
回复
停电^_^
vyc 2003-01-28
  • 打赏
  • 举报
回复
不用那么麻烦吧,io流有的自动格式化能力,格式化不成功会返回特定的标志位。
#include <iostream>
#include <sstream>
#include <string>
#include <conio.h>
using namespace std;
//------------------------------------------------------------------
bool IsNum(string str)
{
istringstream iss(str);
float i;
iss>> i;
return iss.rdstate()== ios_base::eofbit;
}

int main(int argc, char* argv[])
{
cout<<IsNum("reyew4432iu")<<endl;//屏幕输出0
cout<<IsNum("43523fghfd")<<endl;//屏幕输出0
cout<<IsNum("rtyrt")<<endl;//屏幕输出0
cout<<IsNum("-1234")<<endl;//屏幕输出1
getch();
return 0;
}
windcsn 2003-01-27
  • 打赏
  • 举报
回复
if atoi(str) != 0
是行不通的,遇到不是数字的字符就截断取前面的值。
windcsn 2003-01-27
  • 打赏
  • 举报
回复
自己写一个检查的函数,对字符串的每位检查,知道所有的都是数字就确定是数字
函数如此简单
int checknum(char num[],int size)
{
for(int i(0);i<size;i++)
{
if(num[i]>'9'||num[i]<'0')
return 0;//字符串
}
return 1;//数字
}
  • 打赏
  • 举报
回复
up如果是十六进制,可以用isxdigit(char);其实可以自己写的。就是先读入字符串,然后一位一位判断不就行了:)
Davidzhuhua 2003-01-27
  • 打赏
  • 举报
回复
如果为十进制,可以用isdigit()判断每一个字母和字符串是否含有字符‘E’判断。
rtdb 2003-01-27
  • 打赏
  • 举报
回复
if atoi(str) != 0
str就肯定是数字

至于str也可能是0的情况,
单独判断一下吧。
look_think 2003-01-27
  • 打赏
  • 举报
回复
谢谢各位,特别是Cybergate(void) ,我会把每一种情况都列出来,然后做一个类似表达式分析的算法。
用atoi的方法不行,如果给它一个"123a",它会返回123。
只是简单判断里面是否都是数字也不妥,因为还要考虑诸如正负号、小数点等问题。
等作完了,一起散分。
Crystal_arrow 2003-01-27
  • 打赏
  • 举报
回复
判断特定的字符和数字即可
Cybergate 2003-01-27
  • 打赏
  • 举报
回复
这具体要看判定的标准是什么了,可以自己编一个函数,例如:

#include <ctype.h>

int isnumber(const char* p)
{
int flag_e=0, flag_p=0, flag_m=1;
if (!*p) return 0;
for (; *p; p++)
switch (*p) {
case 'e':
case 'E':
if (flag_e) return 0;
flag_e=flag_m=1; break;
case '.':
if (flag_e||flag_p) return 0;
flag_p=1; break;
case '-':
if (!flag_m) return 0;
flag_m=0; break;
default:
if (!isdigit(*p))
return 0;
else {
flag_m=0;
if (flag_e) flag_e=2;
}
}
return flag_e!=1 && p[-1]!='-';
}

当然,这个函数的标准很宽松,也不一定很完善(可能有bug)

这些都被认为是合法的数:
. 0.0
1.2 1.2
3 3.0
-e4 -0*10^4=0
e6 0
-3e-3 -0.003
3e0 3
dizzo 2003-01-27
  • 打赏
  • 举报
回复
同意 windcsn,
加载更多回复(1)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧