Typescript에서 문자열이 숫자인지 확인하는 방법


184

Typescript에서 isNaN은 숫자 값만 허용한다는 오류를 표시합니다.

isNaN('9BX46B6A')

다음으로 parseFloat('9BX46B6A')평가 되기 때문에 false를 반환 합니다.9

isNaN(parseFloat('9BX46B6A'))

Visual Studio에 오류가 표시되어 계속 실행할 수 있지만 올바른 방법으로 수행하고 싶습니다.

현재이 수정 함수를 작성했습니다.

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

답변:


338

숫자로 된 문자열로 변환하는 방법은 함께 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나 parseFloat? 내가 기대하는 것에 더 부합하는 Number('')동안 0을 parseInt('')준다 NaN.
— Didii

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에서 사용할 수 없습니다

rxjs 라이브러리 의 isNumeric 연산자를 사용하여 해결했습니다 ( rxjs / util / isNumeric 가져 오기

최신 정보

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

. . .

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

5
이 방법은 더 이상 rxjs v6에서 사용할 수 없습니다.
— Logic01

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


3

기존의 이미 테스트 된 솔루션을 선택합니다. 예를 들어 typescript의 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));

코드 및 박스 테스트 .

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'))이어야합니다.
— 맥 그리

0

Angular의 정수 (비 부동)의 경우 다음을 사용할 수 있습니다.

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


1
Number.isIntegeryourVariable이미 number유형 인 인 경우 정수 인지 알려줍니다 . 문자열에는 작동하지 않습니다. 따라서 Number.isInteger(Number(yourVariable))트릭을 수행 할 수 있습니다.
— tarrball

-2

문자열을 숫자로 구문 분석 할 수 있는지 여부는 런타임 문제입니다. Typescript는 컴파일 타임 (런타임 아님) 안전에 중점을두기 때문에이 사용 사례를 지원하지 않습니다.


11
정확하지 않다고 제안하는 것처럼 오류로 표시하는 것만으로 충분합니다.
— Jane Panda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.