现在做开软件开发,针对用户涉及到用户的输入时,都会用到一些数和字符号串的转换。
这是一个相对比较简单的问题,但是却也能很好的考验一个人的思维方法和对字符串的学习理解程度。
其实判断一个字符串是不是数字、查数字字符串否英文式格式,这两个问题在boost库中能够找到解决的方法,
但是如果让你用对char 和 string的操作来实现,不去静心想一下,大家可能未必写的出。
记的找第一份工作的时候,部门的技术总监就问了我这么一个问题,刚听到这个题感觉挺简单,说了一下思路,
但是被其几个反问搞的我手有点乱,其实那么些东西实现起来没有难度,做你考虑到了吗?
以前说到程序员,给人的感觉应该是聪明、有天份。。。但现在做作大多数的主流程序员,好像和这些词走远了,
做作一个合格的程序员可能对更多的要求是思维严密。
现在自己工作了也快两年了。。。也技术细节、追求模式、追求架构。写一段漂亮的代码,会自我得意很久。
前些日子,在公司面试新人的时候,我也问了一个我当年被问的问题(有点变态,呵呵。。。)
1、如何判断一个字符串是不是数字
2、查数字字符串否英文式格式
看到的代码、听到的回答让我感触挺深的。有些简单的东西,你能把它完美到什么程度呢?
今天有兴致,一直没有自己动手写过这两个函数,亲自己把它写了一遍。。。呵呵。。。写十行代码就不能避免出现BUG,任何程序不会有尽美,但作为程序员要有追求尽美的精神。。。
//判断一个字符串是不是数字(对负数,小数等做了处理)
bool IsNumber(const char *pszStr)
{
std::string str(pszStr);
CHAR c;
bool bPtExist = false;
for(int i = 0; i < str.length(); i++)
{
c = str.at(i);
if((c >= ('0') && c <= ('9')) || c == ('.') || c == ('-'))
{
if(i == 0 && c == ('.'))
{
return false;
}
else if(!bPtExist && c == ('.'))
{
bPtExist = true;
}
else if(str.length() == 1 && c == ('-'))
{
return false;
}
else if(str.length() > 1 && i != 0 && c == ('-'))
{
return false;
}
else if(bPtExist && c == ('.'))
{
return false;
}
}
else
{
return false;
}
}
if(str.empty())
{
return false;
}
return true;
}
//如果是英文式数字,检查数字字符串否英文式格式如:200,200,100.00
bool CheckNumberComma(const char *pszStr)
{
std::string str(pszStr);
if (-1 != str.find('.'))
{
str = str.substr(0, str.find('.'));
}
int iPre = -1;
int iAfter = -1;
iPre = 0;
iAfter = str.find(',');
while (iAfter != -1)
{
if (3 == (iAfter - iPre))
{
iPre = iAfter + 1;
iAfter = str.find(',', iPre);
continue;
}
else
{
if (0 == iPre && 3 > (iAfter - iPre))//数字的最高低,即字符的开头到第一个逗号的数字个数可以小于三个
{
iPre = iAfter + 1;
iAfter = str.find(',', iPre);
continue;
}
else
{
return false;
}
}
}
//存在逗号,保证最后一个逗号到字符串的尾部,数字的个数必为三个
if(0 != iPre)
{
if (3 != (str.length() - iPre))
{
return false;
}
}
return true;
}