最近在做相关的项目, 在用户输入信息时要对CEdit控件获取的字符串信息判断其是否为合法数字, 通常我们所理解的合法数字是:
1. 如果不为小数, 则字符串中应该不能包含0-9以外的其它字符, 并且按照习惯, 即使用户输入0900, 程序应该能够判断其为合法数字, 并且能够格式化为900
2. 如果为小数, 通常小数点只能在两个数字之间, 并且只能有一个小数点, 如合法的数字: 0.95, 非法数字: 13.
通过上面的两个信息我们就可以写出一个判定函数, VC6上编译通过的代码如下:
判断输入的符号是否为数字
BOOL IsLegalNumber(CString &strInput)
{
strInput.TrimLeft();
strInput.TrimRight();
if(strInput.IsEmpty())
return false;
int len = strInput.GetLength();
char buffer[MAX_PATH + 1] = {0};
int len1, len2;
//判断是否有小数点
if(strInput.Find('.') != -1)
{
char bufferDot[MAX_PATH + 1] = {0};
//匹配数字和小数点
sscanf(strInput, "%[0-9].%[0-9]", buffer, bufferDot);
//判断buffer和bufferDot是否为空且长度之和是否为总长度-1
len1= strlen(buffer);
len2 = strlen(bufferDot);
if(len1 == 0 || len2 == 0)
return false;
if(len != len1 + len2 + 1)
return false;
//去掉整数部分最左边的0
strInput.Format("%d.%s", atoi(buffer), bufferDot);
}
else
{
//匹配数字
sscanf(strInput, "%[0-9]", buffer);
len1 = strlen(buffer);
if(len1 == 0)
return false;
if(len1 != len)
return false;
//去掉整数部分最左边的0
strInput.Format("%d", atoi(buffer));
}
return true;
}
代码中最有效的方式是通过sscanf函数对输入字符串进行格式化的, 里面的sscanf(strInput, "%[0-9].%[0-9]", buffer, bufferDot);第一个%[0-9]表示从左到右查找数字strInput字符串第一个小数点位置前面部分的数字, 后面的%[0-9]表示查找小数点后面的数字.
上面的代码很容易理解, 将小数点前面的数字长度加上小数点后面的数字长度如果等于原来字符串长度-1, 说明是合法的字符串, 如果不是, 则包含非法字符.
上述代码也未经严格测试, 在以后使用过程中若发现问题, 请大家多多指出.
1. 如果不为小数, 则字符串中应该不能包含0-9以外的其它字符, 并且按照习惯, 即使用户输入0900, 程序应该能够判断其为合法数字, 并且能够格式化为900
2. 如果为小数, 通常小数点只能在两个数字之间, 并且只能有一个小数点, 如合法的数字: 0.95, 非法数字: 13.
通过上面的两个信息我们就可以写出一个判定函数, VC6上编译通过的代码如下:
判断输入的符号是否为数字
BOOL IsLegalNumber(CString &strInput)
{
strInput.TrimLeft();
strInput.TrimRight();
if(strInput.IsEmpty())
return false;
int len = strInput.GetLength();
char buffer[MAX_PATH + 1] = {0};
int len1, len2;
//判断是否有小数点
if(strInput.Find('.') != -1)
{
char bufferDot[MAX_PATH + 1] = {0};
//匹配数字和小数点
sscanf(strInput, "%[0-9].%[0-9]", buffer, bufferDot);
//判断buffer和bufferDot是否为空且长度之和是否为总长度-1
len1= strlen(buffer);
len2 = strlen(bufferDot);
if(len1 == 0 || len2 == 0)
return false;
if(len != len1 + len2 + 1)
return false;
//去掉整数部分最左边的0
strInput.Format("%d.%s", atoi(buffer), bufferDot);
}
else
{
//匹配数字
sscanf(strInput, "%[0-9]", buffer);
len1 = strlen(buffer);
if(len1 == 0)
return false;
if(len1 != len)
return false;
//去掉整数部分最左边的0
strInput.Format("%d", atoi(buffer));
}
return true;
}
代码中最有效的方式是通过sscanf函数对输入字符串进行格式化的, 里面的sscanf(strInput, "%[0-9].%[0-9]", buffer, bufferDot);第一个%[0-9]表示从左到右查找数字strInput字符串第一个小数点位置前面部分的数字, 后面的%[0-9]表示查找小数点后面的数字.
上面的代码很容易理解, 将小数点前面的数字长度加上小数点后面的数字长度如果等于原来字符串长度-1, 说明是合法的字符串, 如果不是, 则包含非法字符.
上述代码也未经严格测试, 在以后使用过程中若发现问题, 请大家多多指出.