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

时间:2014-05-02 21:47:29

标签: typescript

在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;
}

12 个答案:

答案 0 :(得分:228)

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

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

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

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

在检查NaN时要小心(运营商===!==无法按预期使用NaN)。使用:

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

答案 1 :(得分:39)

我使用 rxjs 库中的 isNumeric 运算符解决了这个问题(导入 rxjs / util / isNumeric

答案 2 :(得分:14)

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

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

答案 3 :(得分:5)

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

isNaN(+'111') = false;
isNaN(+'111r') = true;
isNaN(+'r') = true;
isNaN(+'') = false;   
isNaN(null) = false;   

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

答案 4 :(得分:4)

您可以使用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') === trueNumber.isFinite('0') === false

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我会选择一个现有的且已经过测试的解决方案。例如,来自打字稿中的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

答案 7 :(得分:0)

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

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

Codesandbox tests

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, () => {}]

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

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

// isNumberic("2") => true
// isNumeric("hi") => false;

答案 10 :(得分:0)

滚动浏览每个答案,惊讶地发现这个简单的单行文字还没有出现:

const isNumber = (val: string | number) => !!(val || val === 0) && !isNaN(Number(val.toString()));

答案 11 :(得分:-1)

如果 var sum=0; var x;

那么,这个呢? sum+=(x|0);