【题目】

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如字符串 “+100” “5e2” “-123” “3.1416” “-1E-16”都表示数值
但是 “12e” “1a3.14” “1.2.3” “+-5” “12e+4.3”都不是

【思路】

1.只能出现数字、符号位、小数点、指数位
2.小数点,指数符号位只能出现一次,且不能出现在开头结尾
3.指数位出现后,小数点不允许再出现
4.符号位只能出现在开头和指数位后面

【解法】

  1. function isNumber(value) {
  2. if (value == undefined) {
  3. return false;
  4. }
  5. let hasPoint = false;  //小数点只能出现一次,出现第一次赋值为true
  6. let hasExp = false; //指数位只能出现一次,第一次出现后赋值为true
  7. for (let i = 0; i < value.length; i++) {
  8. const target = value[i];
  9. if (target >= 0 && target <= 9) {   //所有的数字都可以通过
  10. continue;
  11. } else if (target === 'e' || target === 'E') {
  12. if (hasExp || i === 0 || i === value.length - 1) { //有过e或者第一个就是e或者最后一个是e,不是数值
  13. return false;
  14. } else {
  15. hasExp = true;
  16. continue;
  17. }
  18. } else if (target === '.') {
  19. if (hasPoint || hasExp || i === 0 || i === value.length - 1) { //有过小数点或者e或者小数点在第一个或者最后一个都不是数值
  20. return false;
  21. } else {
  22. hasPoint = true;
  23. continue;
  24. }
  25. } else if (target === '-' || target === '+') {
  26. if (i === 0 || value[i - 1] === 'e' || value[i - 1] === 'E') { //符合位在第一个,或者前一个是指数e
  27. continue;
  28. } else {
  29. return false;
  30. }
  31. } else {
  32. return false;
  33. }
  34. }
  35. return true;
  36. }