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

Posted

技术标签:

【中文标题】在打字稿中,如何检查字符串是不是为数字【英文标题】:In Typescript, How to check if a string is Numeric在打字稿中,如何检查字符串是否为数字 【发布时间】:2014-06-19 16:32:15 【问题描述】:

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

【问题讨论】:

TypeScript Converting a String to a number的可能重复 【参考方案1】:

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

【讨论】:

把它标记为错误就足够了,好像在暗示它不正确。【参考方案2】:

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

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

如果你喜欢简写,你也可以使用一元加号:

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

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

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

【讨论】:

这是否意味着这样做: if (isNaN(+possibleNumberString)) 是一种有效的检查方式? 为什么要在parseIntparseFloat 之上使用NumberNumber('') 给出 0 而parseInt('') 给出NaN 这更符合我的预期。 在原始问题中所述,parseInt('9BX9')(和parseFloat('9BX9'))将返回9,而不是NaN。如果您不想将空字符串转换为 0,请先显式检查空字符串。 如果你想检查它,使用isNaN(Number(what_ever))而不是Number(what_ever) === Nan @sauntimo Number 不是 TypeScript 的东西,它是一个 built-in EcmaScript constructor function,它接受一个值并在作为函数而不是构造函数调用时返回一个数字原语。【参考方案3】:

更新 2

rxjs v6 不再提供此方法

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

更新

import isNumeric from 'rxjs/util/isNumeric';

。 . .

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

【讨论】:

rxjs v6 不再提供此方法。 要求 React 只是为了检测一个数字是否为数字似乎有点过分...github.com/ReactiveX/rxjs/blob/master/src/internal/util/… 【参考方案4】:
function isNumber(value: string | number): boolean

   return ((value != null) &&
           (value !== '') &&
           !isNaN(Number(value.toString())));

【讨论】:

如果value是未定义的,这不会在尝试调用toString()时抛出异常吗? @LCIII - 如果值为undefined,则value != nullfalse,因此 if 语句(在返回中)不会通过第一行代码。因为 if 行之间有一个&&【参考方案5】:

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

您应该始终使用您的用例测试此类功能。如果你有特殊的值类型,这个函数可能不是你的解决方案。 You can test the function here.

结果是:

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

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

【讨论】:

Typescript 称之为“类型保护”【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

var isFullNumber: boolean = 
    Number.isInteger(Number(yourVariable)) && yourVariable !== null;

如@tarrbal 指出的那样编辑 - 我们不能只使用:

Number.isInteger(yourVariable);

为了证明检查这三个测试:

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);
)

还有这 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

【讨论】:

Number.isInteger 只是告诉您 yourVariable(已经是 number 类型)是否为整数。不适用于字符串。所以,Number.isInteger(Number(yourVariable)) 可能会成功。【参考方案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

注意:全局函数isFinite() 和后者Number.isFinite() 之间存在显着差异。在前者的情况下,执行字符串强制 - 所以isFinite('0') === trueNumber.isFinite('0') === false

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

【讨论】:

但是...TS2345:“1”类型的参数不能分配给“数字”类型的参数。它必须是 Number.isFinite(Number('0'));【参考方案9】:

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

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

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

【讨论】:

【参考方案10】:

我的简单解决方案是:

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


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

【讨论】:

【参考方案11】:

如果 变量总和=0; 变量 x;

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

【讨论】:

这如何回答 OP 的问题 How to check if a string is Numeric?请解释一下。【参考方案12】:

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

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

【讨论】:

【参考方案13】:

对于 6 以上的 Rxjs 版本,我们需要像下面这样导入函数“isNumeric”。下面的导入对我有用。

import  isNumeric  from 'rxjs/internal-compatibility/index';

【讨论】:

【参考方案14】:

我的解决方案:

 function isNumeric(val: unknown): val is string | number 
  return (
    !isNaN(Number(Number.parseFloat(String(val)))) &&
    isFinite(Number(val))
  );

// true
isNumeric("-10");
isNumeric("0");
isNumeric("0xff");
isNumeric("0xFF");
isNumeric("8e5");
isNumeric("3.1415");
isNumeric("+10");
isNumeric("144");
isNumeric("5");

// false
isNumeric("-0x42");
isNumeric("7.2acdgs");
isNumeric("");
isNumeric();
isNumeric(NaN);
isNumeric(null);
isNumeric(true);
isNumeric(Infinity);
isNumeric(undefined);
isNumeric([]);
isNumeric("some string");

【讨论】:

【参考方案15】:
 const isNumeric = (value: string): boolean =>
  !new RegExp(/[^\d]/g).test(value.trim());

如果要允许小数点

   const isNumeric = (value: string): boolean =>
      !new RegExp(/[^\d.]/g).test(value.trim());

【讨论】:

以上是关于在打字稿中,如何检查字符串是不是为数字的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在打字稿中使用可能的字符串和数字索引确定对象的类型?

在打字稿中检查 NAN [重复]

如何在打字稿中解码二进制数据字符串

如何在打字稿中扩展字符串?

如何在变量打字稿中动态设置当前时间