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 2016

5
なぜあなたはNumber上記parseIntかparseFloat?Number('')0をparseInt('')与える一方NaN、私が期待するものにより近いものを与えます。
— Didii 2017年

6
元の質問で述べたように、parseInt('9BX9')(およびparseFloat('9BX9'))は戻り9ませんNaN。空の文字列を0に変換したくない場合は、最初に空の文字列を明示的に確認してください。
— Cスヌーバー2017年

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



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

ご覧のとおり、enumでこの関数を使用する場合は注意が必要です。


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.isFinite(Number( '0'));である必要があります。
— Mcgri

0

Angularの完全な数(非浮動)については、以下を使用できます:

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


1
Number.isIntegeryourVariableすでにnumber型であるが整数かどうかを通知するだけです。文字列では機能しません。だから、Number.isInteger(Number(yourVariable))トリックを行うかもしれません。
— tarrball

-2

文字列を数値として解析できるかどうかは、実行時の問題です。Typescriptは(ランタイムではなく)コンパイル時の安全性に重点を置いているため、この使用例はサポートされていません。


11
正しくないことを示唆するかのように、エラーとしてマークするのは十分な懸念です。
— ジェーンパンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.