题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路都在代码中!
bool isNumeric(const char* string) { // 如果第一个字符不是 +、- 、[0-9]直接返回false if (!(isdigit(*string) || *string == '+' || *string == '-')) { return false; } // 第一个字符符合题意,接着往下走 ++string; // poilt 作为小数点的计数 // 如果大于 1 则返回false // 因为整个部分最多只可以出现一个小数点 int poilt = 0; // 该循环的结束条件就是: // (1)遇到 字符e、E 例:+123e -12.34E // (2)是一个正常的数字 例:123 +12.2 -12.3 while (*string != '\0' && *string != 'e' && *string != 'E') { if (*string == '.') { // 出现小数点便加1 poilt++; } // 如果小数点个数 > 1 或者当前字符不是数字或小说点则返回false if ((poilt > 1) || !(isdigit(*string) || *string=='.')) { return false; } ++string; } //这里我们需要判断上一个while 循环跳出的原因是什么? if (*string != '\0') { // 遇到了e ++string; } else { // 是一个正常的数字 return true; } // 在 e 后面如果出现了 +、- 符号则直接跳过即可 if (*string == '-' || *string == '+') { ++string; } // 如果是数字则进行判断 if (isdigit(*string)) { // 此时后面的字符必须全部都是数字,否则返回false while (*string != '\0') { if (!isdigit(*string)) { return false; } ++string; } return true; } else { // 如果e 后面不是数字,不满足要求 return false; } }
累死累活写了这么多,但是看到有的人python解题,我瞬间崩溃了
有时候找对方法还是关键啊!!!
def isNumeric(self, s): try : p = float(s) return True except: return False
这里特别巧妙,就是利用了float函数,它的作用就是将一个整数或者字符串转换为浮点数,这里再结合异常的判断,简直是鬼斧神工!
如果报了异常,就说明无法转换,那它就不是一个合理的浮点数,返回false,反之如果没有异常说明是符合题意的!
当然还有一种逆天的解法就是:正则表达式
return re.match(r"^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$",s)
我要打人了!别拦我~[ ]
虽然说C++效率高,但是别的语言太欺负人了
哎,多学一点总归有好处的!
```
^[+-]?[0-9](.[0-9])?([eE][+-]?[0-9]+)?$
?代表的是可以出现0次或一次
- 代表可以出现1次以上,但是不能是0次
. 代表匹配一个小数点
正则表达式总归来看,还是比较简单的!至于match是python中正则表达式的库函数