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.
