为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2019-05-24 16:13:34
在JavaScript中验证十进制数 - IsNumeric()在JavaScript中验证十进制数的最干净,最有效的方法是什么?奖励积分:明晰。解决方案应该干净简单。跨平台。测试用例:01. IsNumeric('-1')      => true02. IsNumeric('-1.5')    => true03. IsNumeric('0')       => true04. IsNumeric('0.42')    => true05. IsNumeric('.42')     => true06. IsNumeric('99,999')  => false07. IsNumeric('0x89f')   => false08. IsNumeric('#abcdef') => false09. IsNumeric('1.2.3')   => false10. IsNumeric('')        => false11. IsNumeric('blah')    => false
查看完整描述

4 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

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()。


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 1136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信