在 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
网友回答:
啊!不要听正则表达式的答案。正则表达式对此感到恶心,我说的不仅仅是性能。用正则表达式很容易做出微妙的、不可能发现的错误。
如果你不能使用 ,这应该工作得更好:isNaN()
function IsNumeric(input)
{
return (input - 0) == input && (''+input).trim().length > 0;
}
以下是它的工作原理:
该表达式强制 JavaScript 对输入值进行类型强制;它必须首先被解释为减法运算的数字。如果转换为数字失败,则表达式将生成 .然后将此数值结果与您传入的原始值进行比较。由于左侧现在是数字,因此再次使用类型强制。现在,来自两端的输入被强制为来自相同原始值的相同类型,您会认为它们应该始终相同(始终为 true)。但是,有一个特殊的规则说永远不会等于 ,因此无法转换为数字的值(并且只能转换为数字的值)将导致 false。(input - 0)
NaN
NaN
NaN
对长度的检查适用于涉及空字符串的特殊情况。另请注意,它会在您的0x89f测试中下降,但这是因为在许多环境中,这是定义数字文字的好方法。如果要捕获该特定方案,可以添加其他检查。更好的是,如果这是您不使用的原因,那么只需包装您自己的函数,也可以进行额外的检查。isNaN()
isNaN()
总之,如果您想知道一个值是否可以转换为数字,请实际尝试将其转换为数字。
我回去做了一些研究,为什么空格字符串没有预期的输出,我想我现在明白了:空字符串是强制的而不是.只需在长度检查之前修剪字符串即可处理这种情况。0
NaN
针对新代码运行单元测试,它仅在无穷大和布尔文本上失败,唯一应该有问题的情况是您是否正在生成代码(真的,谁会输入文字并检查它是否是数字?你应该知道),这将是一些奇怪的代码生成。
但是,同样,使用它的唯一原因是如果由于某种原因您必须避免使用isNaN()。
网友回答:
@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);
}
附言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;
}
更新 : 角度 4.3:
export function isNumeric(value: any): boolean {
return !isNaN(value - parseFloat(value));
}
网友回答:
这种方式似乎效果很好:
function IsNumeric(input){
var RE = /^-{0,1}d*.{0,1}d+$/;
return (RE.test(input));
}
在一行中:
const IsNumeric = (num) => /^-{0,1}d*.{0,1}d+$/.test(num);
And to test it:
const IsNumeric = (num) => /^-{0,1}d*.{0,1}d+$/.test(num);
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;
}
console.log(TestIsNumeric());
.as-console-wrapper { max-height: 100% !important; top: 0; }
我从 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
模板简介:该模板名称为【在 JavaScript 中验证十进制数的最干净、最有效的方法是什么?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。