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

use*_*546 143 typescript

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

isNaN('9BX46B6A')
Run Code Online (Sandbox Code Playgroud)

并返回false,因为parseFloat('9BX46B6A')求值为9

isNaN(parseFloat('9BX46B6A'))
Run Code Online (Sandbox Code Playgroud)

我仍然可以运行Visual Studio中出现的错误,但我想以正确的方式执行.

目前,我已经写了这个修改过的功能 -

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

C S*_*ver 270

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

Number('1234') // 1234
Number('9BX9') // NaN
Run Code Online (Sandbox Code Playgroud)

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

+'1234' // 1234
+'9BX9' // NaN
Run Code Online (Sandbox Code Playgroud)

检查NaN(操作员===并且!==不能按预期工作NaN)时要小心.使用:

 isNaN(maybeNumber) // returns true if NaN, otherwise false
Run Code Online (Sandbox Code Playgroud)

  • 这是否意味着这样做:if(isNaN(+ possibleNumberString))是一种有效的检查方式? (12认同)
  • 你为什么要在`parseInt`或`parseFloat`之上使用`Number`?`Number('')`给出0,而`parseInt('')`给出'NaN`,这更符合我的预期. (5认同)
  • 正如在原始问题*中提到的那样,`parseInt('9BX9')`(和`parseFloat('9BX9')`)将返回`9`,而不是'NaN`.如果您不希望将空字符串转换为0,请先显式检查空字符串. (4认同)
  • @sauntimo `Number` 不是 TypeScript 的东西,它是一个 [内置的 EcmaScript 构造函数](https://www.ecma-international.org/ecma-262/6.0/#sec-number-constructor),它接受一个值并在作为函数而不是构造函数调用时返回一个数字原语。 (3认同)
  • 如果你想检查它,使用 `isNaN(Number(what_ever))` 而不是 `Number(what_ever) === Nan`。 (2认同)

Ric*_*Lee 44

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

  • 似乎过多地需要 React 来检测数字是否是数字... https://github.com/ReactiveX/rxjs/blob/master/src/internal/util/isNumeric.ts <-- 对于好奇的人 (8认同)
  • rxjs v6中不再提供此方法。 (2认同)

Gil*_*ain 24

我已经从C Snover解释中构建了一个函数.

function isNumber(value: string | number): boolean
{
   return ((value != null) && !isNaN(Number(value.toString())));
}
Run Code Online (Sandbox Code Playgroud)


Hun*_* Vu 17

我这里的简单解决方案是:

const isNumeric = (val: string) : boolean => {
   return !isNaN(Number(val));
}

// isNumberic("2") => true
// isNumeric("hi") => false;
Run Code Online (Sandbox Code Playgroud)

  • 这会将空间、空等视为数字 (2认同)

Jan*_*Jan 8

我会选择现有且已经测试过的解决方案。例如,来自打字稿中的 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;
}
Run Code Online (Sandbox Code Playgroud)

rxjs/isNumeric.ts

没有 rxjs isArray() 函数并使用简单类型:

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

您应该始终使用您的用例来测试此类功能。如果您有特殊的值类型,此函数可能不是您的解决方案。 您可以在这里测试该功能。

结果是:

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
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*son 8

您可以使用该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
Run Code Online (Sandbox Code Playgroud)

注意:全局函数isFinite()和后者有显着区别Number.isFinite()。在前者的情况下,执行字符串强制 - 所以isFinite('0') === truewhile Number.isFinite('0') === false

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


Nic*_*k H 8

简单的答案:(注意空白和空值)

isNaN(+'111') = false;
isNaN(+'111r') = true;
isNaN(+'r') = true;
isNaN(+'') = false;   
isNaN(null) = false;   
Run Code Online (Sandbox Code Playgroud)

https://codepen.io/CQCoder/pen/zYGEjxd?editors=1111


Fel*_*lix 5

考虑到您的变量可以是字符串或数字或任何类型 - 对于 Angular/Typescript 中的完整数字(非浮点数),您可以使用:

var isFullNumber: boolean = 
    Number.isInteger(Number(yourVariable)) && yourVariable !== null;
Run Code Online (Sandbox Code Playgroud)

正如 @tarrbal 所指出的那样进行编辑 - 我们不能仅使用:

Number.isInteger(yourVariable);
Run Code Online (Sandbox Code Playgroud)

为了证明这一点,请检查这 3 个测试:

let testVariables = [0, 1, "0", "1", "A", {}, -3, 0.1, NaN, null, undefined]; 

let isFullNumber: boolean;
let ix: number = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(v);                         // <---
console.log(ix++, ': ', v, isFullNumber);
})

console.log('--------------');

ix = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(Number(v));                 // <---
console.log(ix++, ': ', v, isFullNumber);
})

console.log('--------------');
ix = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(Number(v)) && v !== null;   // <---
console.log(ix++, ': ', v, isFullNumber);
})
Run Code Online (Sandbox Code Playgroud)

这 3 个结果:

1   :       0           true
2   :       1           true
3   :       0           false <- would expect true
4   :       1           false <- would expect true
5   :       A           false
6   :       {}          false
7   :       -3          true
8   :       0.1         false
9   :       NaN         false
10  :       null        false
11  :       undefined   false
----------------------------
1   :       0           true
2   :       1           true
3   :       0           true
4   :       1           true
5   :       A           false
6   :       {}          false
7   :       -3          true
8   :       0.1         false
9   :       NaN         false
10  :       null        true <- would expect false
11  :       undefined   false
----------------------------
1   :       0           true
2   :       1           true
3   :       0           true
4   :       1           true
5   :       A           false
6   :       {}          false
7   :       -3          true
8   :       0.1         false
9   :       NaN         false
10  :       null        false
11  :       undefined   false
Run Code Online (Sandbox Code Playgroud)

  • “Number.isInteger”只是告诉您“yourVariable”(已经是“number”类型)是否是整数。不适用于字符串。因此,“Number.isInteger(Number(yourVariable))”可能可以解决问题。 (4认同)