在 JavaScript 中验证十进制数 - IsNumeric()

2022-08-29 21:53:04

在JavaScript中验证十进制数的最干净,最有效的方法是什么?

奖励积分:

  1. 清晰。解决方案应该是干净和简单的。
  2. 跨平台。

测试用例:

01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false

答案 1

@Joel的答案非常接近,但在以下情况下会失败:

// Whitespace strings:
IsNumeric(' ')    == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1)  == false;
IsNumeric(0)   == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;

前段时间,我必须实现一个函数,找出一个变量是否包含一个数值,无论它的类型如何,它都可以是一个包含数值(我也必须考虑指数符号等),一个对象,几乎任何东西都可以传递给该函数,我不能做出任何类型假设,注意类型强制(例如。 但不应被视为 )。IsNumericStringNumber+true == 1;true"numeric"

我认为值得分享这组对众多函数实现进行的+30单元测试,并分享通过我所有测试的单元测试:

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

P.S. isNaNisFinite由于强制转换为数字而具有令人困惑的行为。在ES6中,Number.isNaNNumber.isFinite将解决这些问题。使用它们时请记住这一点。


更新这是jQuery现在如何做到的(2.2-稳定版)

isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}

更新角度 4.3

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}

答案 2

哎呀!不要听正则表达式的答案。RegEx对此感到厌烦,我说的不仅仅是性能。很容易用正则表达式做出微妙的,不可能发现错误。

如果你不能使用 ,这应该工作得更好:isNaN()

function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}

以下是它的工作原理:

表达式强制JavaScript对输入值进行类型强制;它必须首先被解释为减法运算的数字。如果转换为数字失败,则该表达式将导致 。然后将此数值结果与您传入的原始值进行比较。由于左侧现在是数字,因此再次使用类型强制。现在,来自双方的输入被强制为来自相同原始值的相同类型,您会认为它们应该始终相同(始终为 true)。但是,有一个特殊的规则说永远不等于 ,因此无法转换为数字的值(并且只有不能转换为数字的值)将导致 false。(input - 0)NaNNaNNaN

对长度的检查适用于涉及空字符串的特殊情况。另请注意,它落在0x89f测试中,但这是因为在许多环境中,这是定义数字文本的好方法。如果要捕获该特定方案,可以添加其他检查。更好的是,如果这是你不使用的原因,那么只需将你自己的函数包装起来,也可以进行额外的检查。isNaN()isNaN()

总之,如果您想知道某个值是否可以转换为数字,请实际尝试将其转换为数字。


我回去做了一些研究,为什么空白字符串没有预期的输出,我想我现在明白了:一个空字符串被强制而不是。只需在长度检查之前修剪字符串即可处理这种情况。0NaN

针对新代码运行单元测试,它只在无穷大和布尔文本上失败,唯一应该有问题的时间是如果你正在生成代码(真的,谁会输入一个文本并检查它是否是数字?你应该知道),这将是一些奇怪的代码生成。

但是,同样,使用它的唯一原因是,如果由于某种原因您必须避免使用isNaN()。