在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

当前回答

这应该奏效。这里提供的一些功能有缺陷,也应该比这里的任何其他功能都快。

        function isNumeric(n)
        {
            var n2 = n;
            n = parseFloat(n);
            return (n!='NaN' && n2==n);
        }

解释:

创建自己的副本,然后将数字转换为浮点数,然后将自己与原始数字进行比较,如果它仍然是一个数字(无论是整数还是浮点数),并与原始数字匹配,也就是说,它确实是一个数。

它可以处理数字字符串和普通数字。不适用于十六进制数。

警告:使用风险自负,无保证。

其他回答

这应该奏效。这里提供的一些功能有缺陷,也应该比这里的任何其他功能都快。

        function isNumeric(n)
        {
            var n2 = n;
            n = parseFloat(n);
            return (n!='NaN' && n2==n);
        }

解释:

创建自己的副本,然后将数字转换为浮点数,然后将自己与原始数字进行比较,如果它仍然是一个数字(无论是整数还是浮点数),并与原始数字匹配,也就是说,它确实是一个数。

它可以处理数字字符串和普通数字。不适用于十六进制数。

警告:使用风险自负,无保证。

我使用的是更简单的解决方案:

function isNumber(num) {
    return parseFloat(num).toString() == num
}

knockoutJs内置库验证函数

通过扩展它,该字段得到验证

1) 编号

self.number=ko.obsobservable(numberValue).exextend({number:true});

测试用例

numberValue = '0.0'    --> true
numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '-1'     --> true
numberValue = '-3.5'   --> true
numberValue = '11.112' --> true
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

2) 数字

self.number=ko.obsobservable(numberValue).exextend({digit:true});

测试用例

numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '0.0'    --> false
numberValue = '-1'     --> false
numberValue = '-3.5'   --> false
numberValue = '11.112' --> false
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

3) 最小值和最大值

self.number=可观察(numberValue).扩展({min:5}).扩展;

此字段仅接受介于5和10之间的值

测试用例

numberValue = '5'    --> true
numberValue = '6'    --> true
numberValue = '6.5'  --> true
numberValue = '9'    --> true
numberValue = '11'   --> false
numberValue = '0'    --> false
numberValue = ''    --> false

我在用我做的这个。。。

到目前为止,它一直在发挥作用:

function checkNumber(value) {
    if ( value % 1 == 0 )
        return true;
    else
        return false;
}

如果你发现它有任何问题,请告诉我。

就像任何数字都应该被一整除而不剩下任何东西一样,我想我可以使用这个模块,如果你尝试将一个字符串分割成一个数字,结果不会是这样。所以

我找到了简单的解决方案,可能不是最好的,但效果很好:)

所以,我接下来要做的是,将字符串解析为Int,并检查新变量的长度大小(现在是Int类型)是否和原始字符串变量的长度相同。从逻辑上讲,如果大小相同,则意味着字符串被完全解析为int,并且只有当字符串仅由数字“构成”时,这才是可能的。

var val=1+$(e).val()+'';
var n=parseInt(val)+'';
if(val.length == n.length )alert('Is int');

您可以很容易地将该代码放在函数中,如果int,则使用return true代替alert。记住,如果您在字符串中使用点或逗号,您将检查它是否仍然为false,因为您正在解析为int。

注意:在e.val上添加1+,因此不会删除起始零。