在打字稿中,如何检查字符串是否为数字


180

在Typescript中,这显示一个错误,说isNaN仅接受数字值

isNaN('9BX46B6A')

并且返回false,因为parseFloat('9BX46B6A')计算结果为9

isNaN(parseFloat('9BX46B6A'))

我仍然可以在Visual Studio中显示错误的情况下运行,但是我想以正确的方式进行操作。

目前,我已经编写了此修改后的功能-

static isNaNModified = (inputStr: string) => {
    var numericRepr = parseFloat(inputStr);
    return isNaN(numericRepr) || numericRepr.toString().length != inputStr.length;
}

Answers:


335

将字符串转换为数字的方法是Number,而不是parseFloat

Number('1234') // 1234
Number('9BX9') // NaN

如果您喜欢速记,也可以使用一元加运算符:

+'1234' // 1234
+'9BX9' // NaN

检查NaN时要小心(运算符===!==请不要按预期工作NaN)。用:

 isNaN(maybeNumber) // returns true if NaN, otherwise false

18
这是否意味着这样做:if(isNaN(+ possibleNumberString))是一种有效的检查方法?
Mathijs Segers

5
你为什么要在Number上面parseInt或上面使用parseFloatNumber('')给0而parseInt('')给与NaN我期望的更一致。
Didii '17

6
原始问题所述parseInt('9BX9')(和parseFloat('9BX9'))将返回9,而不是NaN。如果您不希望将空字符串转换为0,请先明确检查空字符串。
C Snover

1
如果要检查,请使用isNaN(Number(what_ever))代替Number(what_ever) === Nan
k0pernikus

3
@sauntimo Number不是TypeScript的东西,它是内置的EcmaScript构造函数,该函数接受值并在作为函数而不是构造函数调用时返回数字基元。
C Snover

46

更新2

rxjs v6中不再提供此方法

我通过解决它ISNUMERIC运营商从rxjs库(进口rxjs / UTIL / ISNUMERIC

更新资料

import { isNumeric } from 'rxjs/util/isNumeric';

。。。

var val = "5700";
if (isNumeric(val)){
   alert("it is number !");
}

5
rxjs v6中不再提供此方法。
Logic01


3

我会选择一个现有的且已经过测试的解决方案。例如,来自打字稿中的rxjs的代码:

function isNumeric(val: any): val is number | string {
  // parseFloat NaNs numeric-cast false positives (null|true|false|"")
  // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  // subtraction forces infinities to NaN
  // adding 1 corrects loss of precision from parseFloat (#15100)
  return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
}

rxjs / isNumeric.ts

如果没有rxjs isArray()函数并具有简单的类型:

function isNumeric(val: any): boolean {
  return !(val instanceof Array) && (val - parseFloat(val) + 1) >= 0;
}

您应该始终在用例中测试这些功能。如果您有特殊的值类型,则此功能可能不是您的解决方案。 您可以在此处测试功能。

结果是:

enum         : CardTypes.Debit   : true
decimal      : 10                : true
hexaDecimal  : 0xf10b            : true
binary       : 0b110100          : true
octal        : 0o410             : true
stringNumber : '10'              : true

string       : 'Hello'           : false
undefined    : undefined         : false
null         : null              : false
function     : () => {}          : false
array        : [80, 85, 75]      : false
turple       : ['Kunal', 2018]   : false
object       : {}                : false

如您所见,如果将此函数与枚举一起使用,则必须小心。



1

大多数时候,我们要检查的值是字符串还是数字,所以这是我使用的函数:

const isNumber = (n: string | number): boolean => 
    !isNaN(parseFloat(String(n))) && isFinite(Number(n));

Codesandbox测试

const willBeTrue = [0.1, '1', '-1', 1, -1, 0, -0, '0', "-0", 2e2, 1e23, 1.1, -0.1, '0.1', '2e2', '1e23', '-0.1', ' 898', '080']

const willBeFalse = ['9BX46B6A', "+''", '', '-0,1', [], '123a', 'a', 'NaN', 1e10000, undefined, null, NaN, Infinity, () => {}]

1

您可以使用以下Number.isFinite()功能:

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false
Number.isFinite('0');       // false
Number.isFinite(null);      // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

注意:全局函数isFinite()与后者之间存在显着差异Number.isFinite()。在前者的情况下,将执行字符串强制转换-因此isFinite('0') === true,而Number.isFinite('0') === false

另外,请注意,这在IE中不可用!


但是... TS2345:无法将类型“ 1”的参数分配给类型“ number”的参数。它必须是Number.isFinite(Number('0'));
Mcgri

0

对于Angular中的整数(非浮点数),可以使用:

if (Number.isInteger(yourVariable)) { ... }


1
Number.isInteger只是告诉您是否yourVariable已经是number类型的整数。不适用于字符串。因此,Number.isInteger(Number(yourVariable))可能会成功。
tarrball

-2

是否可以将字符串解析为数字是运行时的问题。Typescript不支持此用例,因为它专注于编译时(而非运行时)安全性。


11
将其标记为错误就足够了,好像表明它是不正确的一样。
Jane Panda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.