验证JavaScript中的十进制数

什么是最简洁,最有效的验证JavaScript中十进制数的方法?

奖励积分为:

  • 明晰。 解决方案应该干净简单。
  • 跨平台。
  • 测试用例:

    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
    

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

    // Whitespace strings:
    IsNumeric(' ') == true;
    IsNumeric('tt') == true;
    IsNumeric('nr') == true;
    
    // Number literals:
    IsNumeric(-1) == false;
    IsNumeric(0) == false;
    IsNumeric(1.1) == false;
    IsNumeric(8e5) == false;
    

    前一段时间,我必须实现一个IsNumeric函数,以查明一个变量是否包含一个数值, 而不管它的类型如何 ,它可能是一个包含数值的String (我也必须考虑指数符号等),一个Number对象,几乎任何可以传递给函数,我不能让任何类型的假设,照顾类型强制的(如+true == 1;true不应该被看作是"numeric" )。

    我认为值得与众多函数实现共享这组+30个单元测试 (旧链接),并且也共享通过我所有测试的测试:

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

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


    更新 :下面是jQuery如何做(2.2稳定):

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

    更新 :Angular 4.3:

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

    Arrrgh! 不要听正则表达式的答案。 RegEx对此很狡猾,我不只是在表演。 用你的正则表达式很容易做出微妙的,不可能发现的错误。

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

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

    以下是它的工作原理:

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

    长度检查是针对涉及空字符串的特殊情况。 还要注意它落在你的0x89f测试上,但那是因为在许多环境中,这是定义数字文字的好方法。 如果你想抓住特定的情况,你可以添加一个额外的支票。 更好的是,如果这是您不使用isNaN()原因,那么只需将自己的函数包装在isNaN() ,也可以执行额外的检查。

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


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

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

    但是,再次, 使用这个唯一的理由是,如果由于某种原因你必须避免isNaN()。


    这种方式似乎运作良好:

    function IsNumeric(input){
        var RE = /^-{0,1}d*.{0,1}d+$/;
        return (RE.test(input));
    }
    

    并测试它:

    // alert(TestIsNumeric());
    
    function TestIsNumeric(){
        var results = ''
        results += (IsNumeric('-1')?"Pass":"Fail") + ": IsNumeric('-1') => truen";
        results += (IsNumeric('-1.5')?"Pass":"Fail") + ": IsNumeric('-1.5') => truen";
        results += (IsNumeric('0')?"Pass":"Fail") + ": IsNumeric('0') => truen";
        results += (IsNumeric('0.42')?"Pass":"Fail") + ": IsNumeric('0.42') => truen";
        results += (IsNumeric('.42')?"Pass":"Fail") + ": IsNumeric('.42') => truen";
        results += (!IsNumeric('99,999')?"Pass":"Fail") + ": IsNumeric('99,999') => falsen";
        results += (!IsNumeric('0x89f')?"Pass":"Fail") + ": IsNumeric('0x89f') => falsen";
        results += (!IsNumeric('#abcdef')?"Pass":"Fail") + ": IsNumeric('#abcdef') => falsen";
        results += (!IsNumeric('1.2.3')?"Pass":"Fail") + ": IsNumeric('1.2.3') => falsen";
        results += (!IsNumeric('')?"Pass":"Fail") + ": IsNumeric('') => falsen";
        results += (!IsNumeric('blah')?"Pass":"Fail") + ": IsNumeric('blah') => falsen";
    
        return results;
    }
    

    我从http://www.codetoad.com/javascript/isnumeric.asp中借用了这个正则表达式。 说明:

    /^ match beginning of string
    -{0,1} optional negative sign
    d* optional digits
    .{0,1} optional decimal point
    d+ at least one digit
    $/ match end of string
    
    链接地址: http://www.djcxy.com/p/681.html

    上一篇: Validate decimal numbers in JavaScript

    下一篇: How do I install pip on Windows?