In Typescript, Come verificare se una stringa è numerica


184

In Typescript, questo mostra un errore che dice che isNaN accetta solo valori numerici

isNaN('9BX46B6A')

e questo restituisce false perché parseFloat('9BX46B6A')valuta9

isNaN(parseFloat('9BX46B6A'))

Posso ancora eseguire l'errore visualizzato in Visual Studio, ma vorrei farlo nel modo giusto.

Attualmente, ho scritto questa funzione modificata -

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

Risposte:


338

Il modo per convertire una stringa in un numero è con Number, no parseFloat.

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

Puoi anche usare l'operatore unario plus se ti piace la stenografia:

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

Fai attenzione quando controlli contro NaN (l'operatore ===e !==non funziona come previsto NaN). Uso:

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

18
significa che fare questo: if (isNaN (+ possibleNumberString)) è un modo valido di controllo?
Mathijs Segers,

5
Perché dovresti usare Numbersopra parseInto parseFloat? Number('')dà 0 mentre parseInt('')NaNche è più in linea con quello che mi aspetto.
Didii,

6
Come menzionato nella domanda originale , parseInt('9BX9')(e parseFloat('9BX9')) tornerà 9, no NaN. Se non si desidera la conversione di una stringa vuota in 0, verificare prima esplicitamente la stringa vuota.
C Snover,

1
Se vuoi verificarlo, usa isNaN(Number(what_ever))invece di Number(what_ever) === Nan.
k0pernikus,

3
@sauntimo Numbernon è una cosa TypeScript, è una funzione di costruzione EcmaScript incorporata che accetta un valore e restituisce un numero primitivo quando viene chiamato come funzione anziché come costruttore.
C Snover,

46

Aggiornamento 2

Questo metodo non è più disponibile in rxjs v6

Sto risolto utilizzando il isNumeric operatore rxjs libreria (importazione rxjs / util / isNumeric

Aggiornare

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

. . .

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

5
Questo metodo non è più disponibile in rxjs v6.
Logic01

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


3

Sceglierei una soluzione esistente e già testata. Ad esempio questo da rxjs in dattiloscritto:

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

Senza la funzione isArray () di rxjs e con digitazioni semplificate:

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

Dovresti sempre testare tali funzioni con i tuoi casi d'uso. Se si dispone di tipi di valore speciali, questa funzione potrebbe non essere la soluzione. Puoi testare la funzione qui.

I risultati sono:

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

Come puoi vedere, devi fare attenzione, se usi questa funzione con enum.


1

Il più delle volte il valore che vogliamo controllare è stringa o numero, quindi ecco la funzione che uso:

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

Test codici e casella .

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

Puoi usare la Number.isFinite()funzione:

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

Nota: esiste una differenza significativa tra la funzione globale isFinite()e quest'ultima Number.isFinite(). Nel caso del primo, viene eseguita la coercizione delle stringhe - così isFinite('0') === truementre Number.isFinite('0') === false.

Inoltre, tieni presente che questo non è disponibile in IE!


Ma ... TS2345: L'argomento del tipo '"1"' non è assegnabile al parametro del tipo 'numero'. Deve essere Number.isFinite (Number ('0'));
Mcgri

0

Per i numeri completi (non mobili) in Angolare puoi usare:

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


1
Number.isIntegerti dice solo se yourVariable, che è già un numbertipo, è un numero intero. Non funziona con le stringhe. Quindi, Number.isInteger(Number(yourVariable))potrebbe fare il trucco.
tarrball,

-2

Se una stringa può essere analizzata come un numero è un problema di runtime. Typescript non supporta questo caso d'uso poiché è incentrato sulla sicurezza del tempo di compilazione (non di runtime).


11
È abbastanza una preoccupazione contrassegnarlo come un errore, come per suggerire che non è corretto.
Jane Panda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.