U Typescriptu, Kako provjeriti je li niz broj


U Typescriptu, ovo prikazuje grešku koja kaže da isNaN prihvaća samo numeričke vrijednosti

isNaN('9BX46B6A')

i ovo vraća false jer parseFloat('9BX46B6A') evaluira na 9

isNaN(parseFloat('9BX46B6A'))

Još uvijek mogu pokrenuti program iako se greška pojavljuje u Visual Studiu, ali bih to želio učiniti na pravi način.

Trenutno sam napisao ovu modificiranu funkciju -

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

Odgovor #1

Način za pretvaranje niza u broj je pomoću Number, a ne parseFloat.

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

Također možete koristiti unarni operator plus ako volite skraćeni zapis:

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

Budite oprezni pri provjeri protiv NaN (operatori === i !== ne rade kako se očekuje s NaN). Koristite:

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

Odgovor #2

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

Odgovor #3

Ažuriranje

Ova metoda više nije dostupna u rxjs v6 :


Riješio sam to korištenjem operatora isNumeric iz rxjs biblioteke (uvozeći rxjs/util/isNumeric)

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

. . .

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

Odgovor #4

Moje jednostavno rješenje ovdje je:

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

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

Odgovor #5

Možete koristiti funkciju 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

Napomena: postoji značajna razlika između globalne funkcije isFinite() i kasnije Number.isFinite(). U slučaju prve, izvršava se prisilna konverzija stringa - pa je isFinite('0') === true dok je Number.isFinite('0') === false.

Također, imajte na umu da ovo nije dostupno u IE-u!

Odgovor #6

Odabrao bih postojeće i već testirano rješenje. Na primjer, ovo iz rxjs u Typescriptu:

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

Bez rxjs funkcije isArray() i s pojednostavljenim tipiziranjem:

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

Uvijek biste trebali testirati takve funkcije sa svojim slučajevima korištenja. Ako imate posebne tipove vrijednosti, ova funkcija možda neće biti vaše rješenje. Funkciju možete testirati ovdje.

Rezultati su:

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

Kao što možete vidjeti, morate biti oprezni ako koristite ovu funkciju s enumeracijama.

Povezani članci