题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
题解:
表示数值的字符串遵循模式A[[B]][elEC]或者.B[elEC],其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着e'或者E’为数值的指数部分。在小数里可能没有数值的整数部分。例如,小数.123等于0.123。
因此A部分不是必需的。如果一个数没有整数部分,那么它的小数部分不能为空。
1 class Solution { 2 public: 3 bool isNumeric(char* string) 4 { 5 if (string == nullptr)return false; 6 7 bool numeric = scanInteger(&string); 8 9 // 如果出现'.',接下来是数字的小数部分 10 if (*string == '.') 11 { 12 ++string; 13 14 // 下面一行代码用||的原因: 15 // 1. 小数可以没有整数部分,例如.123等于0.123; 16 // 2. 小数点后面可以没有数字,例如233.等于233.0; 17 // 3. 当然小数点前面和后面可以有数字,例如233.666 18 numeric = scanUnsignedInteger(&string) || numeric; 19 } 20 21 // 如果出现'e'或者'E',接下来跟着的是数字的指数部分 22 if (*string == 'e' || *string == 'E') 23 { 24 ++string; 25 26 // 下面一行代码用&&的原因: 27 // 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1; 28 // 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4 29 numeric = numeric && scanInteger(&string); 30 } 31 32 return numeric && *string == '\0'; 33 } 34 35 bool scanUnsignedInteger(char** str) 36 { 37 const char* before = *str; 38 while (**str != '\0' && **str >= '0' && **str <= '9') 39 ++(*str); 40 41 // 当str中存在若干0-9的数字时,返回true 42 return *str > before; 43 } 44 45 // 整数的格式可以用[+|-]B表示, 其中B为无符号整数 46 bool scanInteger(char** str) 47 { 48 if (**str == '+' || **str == '-') 49 ++(*str); 50 return scanUnsignedInteger(str); 51 } 52 };