JavaScript数字校验函数问题:特殊字符未被正确拦截
修复判断纯整数/浮点数的JavaScript函数问题
问题描述
需求是实现一个JavaScript函数:当输入为纯整数或浮点数(数字类型或标准字符串形式)时返回true,只要输入包含&、%、、"、~这类特殊字符就返回false`。但现有代码无法满足需求:
const float = (value) => { return !isNaN(Number(value)) && isFinite(value); };
比如调用float('18.&4')或float('1%8.4')会错误返回true——因为Number()方法会忽略部分特殊字符,只解析前面的有效数字(如Number('1%8.4')会返回1),导致判断逻辑失效。
问题根源
Number()的解析逻辑是"尽可能提取有效数字",而非严格校验输入是否为纯数字。它会忽略字符串中有效数字之后的非数字字符,甚至对某些符号(如%)做特殊处理,完全不符合我们需要完全排除非数字字符的要求。
解决方案:用正则严格校验
下面的函数通过类型判断+正则匹配,实现严格的纯整数/浮点数校验:
const isNumber = (value) => { // 正则规则:允许正负号,匹配整数、带小数的整数、纯小数 const validNumberPattern = /^[+-]?(\d+(\.\d*)?|\.\d+)$/; if (typeof value === 'number') { // 数字类型直接校验是否为有限数(排除NaN、Infinity) return isFinite(value); } else if (typeof value === 'string') { // 字符串类型先去首尾空格,再用正则匹配 return validNumberPattern.test(value.trim()); } // 非数字/字符串类型直接返回false return false; };
校验规则说明
- 支持正负号开头(如
-123、+45.67) - 允许三种数字格式:纯整数(
123)、整数带小数(123.45)、纯小数(.45) - 严格禁止任何非数字字符(包括&、%、`等特殊符号)
- 自动忽略字符串首尾空格(如
' 123.45 '会被判定为有效)
测试用例
| 输入值 | 返回结果 |
|---|---|
123 | true |
123.45 | true |
'-123.45' | true |
'.45' | true |
'18.&4' | false |
'1%8.4' | false |
'123' |false` | | |
'123"' | false |
'~123' | false |
Infinity | false |
NaN | false |
{} | false |
内容的提问来源于stack exchange,提问作者Miss Shrivastava
相关产品推荐
相关产品推荐

