Why is angular.isNumber() not working as expected?
似乎AngularJS的angular.isNumber无法正常工作。它不适用于数字字符串。难道我做错了什么?我应该只使用isNaN()吗?
1 2 3 4
| angular.isNumber('95.55') == false
angular.isNumber('95.55' * 1) == true
angular.isNumber('bla' * 1) == true
angular.isNumber(NaN) == true |
我需要一些东西来查看字符串是否是一个数字(实际上是一个数字),并且angular.isNumber()不允许我这样做,除非我乘以1,但是如果我这样做,那么它将始终为真。同样,NaN也不是数字(按定义),因此应返回false。
- stackoverflow.com/questions/2801601/…
-
什么不起作用? \\ '95 .55 \\'不是数字,它是一个字符串。同样,将一个字符串乘以一个数字将使javascript将这个字符串解析/广播为一个数字,然后尝试执行该操作。串联的工作方式有所不同,因为数字字符串将是一个字符串(javascript将数字转换为字符串)。
-
我在问题中添加了@BradM,以帮助阐明问题。
-
如果提供了null(typeof就是这种情况),angular.isObject()不会返回true,因此"那是原生javascript的工作方式"的借口是一个非参数。而不是表面上的欺骗问题地位的理由。
-
像这样使用:angular.isNumber(num || num),如果num是string / object / etc ..在NaN上是首选。因此,它实际上是检查来源是否为数字。
-
请访问stackoverflow.com/a/1830844/504836以获取有效的IsNumeric方法。
-
我投票这不是链接的问题的重复。这个问题是关于angularJS isNumber方法的预期行为的。与NaN是否被视为"数字"类型无关。
在JavaScript中,typeof NaN === 'number'。
如果需要将字符串识别为数字,请将其转换为Number,然后转换回String并将其与输入进行比较。例如,
1 2 3 4 5 6 7 8 9
| function stringIsNumber(s) {
var x = +s; // made cast obvious for demonstration
return x.toString() === s;
}
stringIsNumber('95.55'); // true
stringIsNumber('foo'); // false
// still have
stringIsNumber('NaN'); // true |
- 只是要指出,如果要处理的数字非常小或非常大,这可能会产生舍入错误。
-
我只是将此链接添加到有angular的github页面上的一个问题,他们将其放弃,因为无法修复:github.com/angular/angular.js/issues/701
-
警告:由于JavaScript中的(0.0000005).toString()==" 5e-7",因此该方法针对" 0.0000005"之类的有效数字返回false。
-
@joelnet没有考虑过这类情况。 +x.toString() === x在哪里失败?您也许可以考虑这些极端情况
按以下方式使用,
1
| angular.isNumber(eval('99.55')) |
对于其他表达式,我们也可以使用eval(input)。
注意:eval()是一种javascript方法
编辑:
不建议使用eval(),如文档所述,切勿使用eval()!
感谢@Diogo Kollross
我正在处理相同的问题,并且正在尝试解决这种情况。因此,我创建了一种略有不同的方法。
FIDDLE
1 2 3 4 5
| function isStringNumber(str) {
var parsed = parseFloat(str);
var casted = +str;
return parsed === casted && !isNaN(parsed) && !isNaN(casted);
} |