字符串处理函数:识别一字符串所属的数值常量类型(十六进制、二进制、十进制整数,浮点数)
2012-01-06 22:56
686 查看
http://rosettacode.org/wiki/Determine_if_a_string_is_numeric
先判断是否是整数。
浮点可以看作是两个整数加小数点的组合。
字符串处理函数:识别一字符串所属的数值常量类型(十六进制、二进制、十进制整数,浮点数)
2009-07-01 13:31
delphi TryStrToFloat
先判断是否是整数。
浮点可以看作是两个整数加小数点的组合。
字符串处理函数:识别一字符串所属的数值常量类型(十六进制、二进制、十进制整数,浮点数)
2009-07-01 13:31
/* * 程序功能:判断一字符串属于何种常量类型,浮点数、十进制整数、十六进制数 * 还是二进制数 * 实现原理:分别根据各种类型常量的特征码判断 * 作者: BUG_lauo * 日期: 2009-7-1 */ #include<iostream> #include<string> #include<list> using namespace std; enum CONSTANT_TYPE{DOUBLE,DECINT,HEXINT,BININT,ERRORKIND=-1}; CONSTANT_TYPE kind_of_var(string str)//识别是否为标准类型常量 { int len=str.length(); if(len==0) return ERRORKIND;//长度为零,返回错误代码 for(int i=0;i<len;i++) if(str[i]>='A'&&str[i]<='Z') str[i]+='a'-'A'; if(len>=2&&str[0]=='0'&&str[1]=='x')//如果是十六进制数 { if(len==2) return ERRORKIND; for(int i=2;i<len;i++) if(!(isdigit(unsigned char (str[i]))||str[i]<='f'&&str[i]>='a'))//如果不是数字或者a-f组成,则返回错误代码 return ERRORKIND; return HEXINT; } else if(str[len-1]=='b')//如果是二进制常量 { for(int i=0;i<len-1;i++) if(!(str[i]=='0'||str[i]=='1')) return ERRORKIND;//错误的二进制常量 return BININT; } else { int i=(str[0]=='-'?1:0); for(;i<len;i++) if(!isdigit(unsigned char(str[i]))) break; if(i==len) return DECINT;//为标准的十进制整数 /* 以下将判断是否为正确的浮点数 */ list<int> dot,e,sign;//.点号 e号 -号 int dot_num=0,e_num=0,sign_num=0; for(i=0;i<len;i++) switch(str[i]) { case '.':dot_num++;dot.insert(dot.end(),i);break; case 'e':e_num++;e.insert(e.end(),i);break; case '-':sign_num++;sign.insert(sign.end(),i);break; default: if(!isdigit(unsigned char(str[i]))) return ERRORKIND; } list<int>::iterator dot_i=dot.begin(),dot_end=dot.end(); list<int>::iterator e_i=e.begin(),e_end=e.end(); list<int>::iterator sign_i=sign.begin(),sign_end=sign.end(); if(e_num>=2) return ERRORKIND;//出现多个e if(e_num==0) { if(sign_num>1||dot_num>1) return ERRORKIND;//如果在非科学计数法的情况下,出现多个. -则表明出错 if(sign_num==1&&(*sign_i)!=0) return ERRORKIND;//出现负号都不在首字符位置 return DOUBLE;//如果正确,则返回正确类型标识符 } if(e_num==1)//存在e表明使用了科学计数法 { if(sign_num>2||dot_num>=2) return ERRORKIND;//如果多于两个负号或者.号大于等于两个 if(sign_num==1&&((*sign_i)!=0&&(*sign_i)!=(*e_i)+1)) return ERRORKIND;//如果只有一个负号,应该出现在第一位,或者e之后 if(sign_num==2&&(*sign_i)!=0) return ERRORKIND;//如果出现两个负号,第一个负号却不在第一位,出错 sign_i++; if(sign_num==2&&(*sign_i)!=(*e_i)+1) return ERRORKIND;//第二个负号应该出现在e之后 if(dot_num==1&&(*dot_i)>(*e_i)) return ERRORKIND;//如果逗号出现在e之后,则表明出错 return DOUBLE; } } return ERRORKIND; } string get_code(CONSTANT_TYPE k) { switch(k) { case ERRORKIND:return "error!";break; case DOUBLE:return "double";break; case DECINT:return "decint";break; case BININT:return "binint";break; case HEXINT:return "hexint";break; } } int main() { cout<<get_code(kind_of_var("0x1000ef"))<<endl; cout<<get_code(kind_of_var("013333b"))<<endl; cout<<get_code(kind_of_var("01000111b"))<<endl; cout<<get_code(kind_of_var(".333.e-10"))<<endl; cout<<get_code(kind_of_var("3-4.333e-111"))<<endl; cout<<get_code(kind_of_var(".333e-10"))<<endl; cout<<get_code(kind_of_var("-1.333e1-3"))<<endl; cout<<get_code(kind_of_var("1-3.333e-13"))<<endl; cout<<get_code(kind_of_var("0xABCDEFZ"))<<endl; cout<<get_code(kind_of_var("0XABCD10034"))<<endl; cout<<get_code(kind_of_var("-19348589"))<<endl; cout<<get_code(kind_of_var("-134e1000"))<<endl; cout<<get_code(kind_of_var("-14abcd"))<<endl; cout<<get_code(kind_of_var("-000000"))<<endl; cout<<get_code(kind_of_var("-8374837-39489384"))<<endl; cout<<get_code(kind_of_var("-8374837e-3941111114444"))<<endl; cout<<get_code(kind_of_var("-8374837e-3.941111114444"))<<endl; cout<<get_code(kind_of_var("-8374837e.333"))<<endl; } |
相关文章推荐
- 字符串处理函数:识别一字符串所属的数值常量类型(十六进制、二进制、十进制整数,浮点数)
- C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式
- Java数值转化为二进制、十进制、十六进制字符串
- 关于字符串转二进制、八进制、十进制、十六进制等的函数
- T-SQL编写程序,将十进制数值转换为二进制字符串后输出
- 将一个十六进制字符串转换为十进制数值的问题
- c++下使用CString将字符串转二进制、八进制、十进制、十六进制
- 实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
- 将一个十六进制字符串转换为十进制数值的问题
- 整数的十进制、二进制、八进制与十六进制
- 输入一个表示十六进制的字符串,转换为十进制的整数输出。
- Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数
- 十进制-->二进制,十进制-->八进制,十进制-->十六进制【函数封装】
- 3.写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
- 将一个十六进制“字符串”转换为十进制数值的问题
- 将一个十六进制字符串转换为十进制数值的问题
- Java byte[] 字节数组 转 二进制 八进制 十进制 十六进制字符串
- 使用移位操作把十进制转换为二进制与十六进制字符串输出
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
- C语言中字符串如何转换为二进制、八进制、十进制、十六进制