Modo (incorporato) in JavaScript per verificare se una stringa è un numero valido


1190

Spero che ci sia qualcosa nello stesso spazio concettuale della vecchia IsNumeric()funzione VB6 ?


3
Vedi questa domanda correlata , che ho posto qualche tempo fa.
Michael Haren,

38
Se vai a questa domanda, prova a saltare tutte le risposte RegEx. Questo NON è il modo di farlo.
Joel Coehoorn,

14
A meno che uno non voglia fare esattamente questo: Per verificare se una determinata stringa ha un formato di un flusso di cifre valido. Perché dovrebbe essere sbagliato allora?
SasQ,

17
La risposta selezionata non è corretta !!! Vedere le sue osservazioni, ma in fondo non riesce con ad esempio isNaN(""), isNaN(" "), isNaN(false), ecc restituisce falseper questi, il che implica che essi sono numeri.
Andrew,

1
quindi la risposta selezionata non è corretta, regexp non è nemmeno il modo di farlo. Quale è corretto allora?
vir us

Risposte:


2322

Per verificare se una variabile (inclusa una stringa) è un numero, controlla se non è un numero:

Funziona indipendentemente dal fatto che il contenuto della variabile sia una stringa o un numero.

isNaN(num)         // returns true if the variable does NOT contain a valid number

Esempi

isNaN(123)         // false
isNaN('123')       // false
isNaN('1e10000')   // false (This translates to Infinity, which is a number)
isNaN('foo')       // true
isNaN('10px')      // true

Certo, puoi negarlo se necessario. Ad esempio, per implementare l' IsNumericesempio che hai fornito:

function isNumeric(num){
  return !isNaN(num)
}

Per convertire una stringa contenente un numero in un numero:

Funziona solo se la stringa contiene solo caratteri numerici, altrimenti restituisce NaN.

+num               // returns the numeric value of the string, or NaN 
                   // if the string isn't purely numeric characters

Esempi

+'12'              // 12
+'12.'             // 12
+'12..'            // NaN
+'.12'             // 0.12
+'..12'            // NaN
+'foo'             // NaN
+'12px'            // NaN

Per convertire una stringa liberamente in un numero

Utile per convertire "12px" in 12, ad esempio:

parseInt(num)      // extracts a numeric value from the 
                   // start of the string, or NaN.

Esempi

parseInt('12')     // 12
parseInt('aaa')    // NaN
parseInt('12px')   // 12
parseInt('foo2')   // NaN      These last two may be different
parseInt('12a5')   // 12       from what you expected to see. 

Galleggianti

Tieni presente che, diversamente +num, parseInt(come suggerisce il nome) convertirai un float in un numero intero tagliando via tutto ciò che segue il punto decimale (se vuoi usare a parseInt() causa di questo comportamento, probabilmente stai meglio usando un altro metodo ) :

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

Stringhe vuote

Le stringhe vuote possono essere poco intuitive. +numconverte le stringhe o le stringhe vuote con spazi in zero e isNaN()assume lo stesso:

+''                // 0
+'   '             // 0
isNaN('')          // false
isNaN('   ')       // false

Ma parseInt()non è d'accordo:

parseInt('')       // NaN
parseInt('   ')    // NaN

133
Una nota molto importante su parseInt è che ti permetterà di specificare una radice per convertire la stringa in un int. Questo è un grande gotcha in quanto cerca di indovinare una radice per te se non la fornisci. Quindi, ad esempio: parseInt ("17") risulta in 17 (decimale, 10), ma parseInt ("08") risulta in 0 (ottale, 8). Quindi, a meno che tu non voglia diversamente, è più sicuro usare parseInt (numero, 10), specificando 10 come radix esplicitamente.
Adam Raney,

36
Nota che! IsNaN (non definito) restituisce false.
David Hellsing,

111
Questo è semplicemente sbagliato: come ha ottenuto così tanti voti? Non è possibile utilizzare isNaN"Per verificare se una variabile non è un numero". "not a number" non è lo stesso di "IEEE-794 NaN", che è ciò isNaNper cui vengono testati. In particolare, questo utilizzo non riesce quando si verificano almeno booleane e stringhe vuote. Vedi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
EML

46
Il modo più veloce possibile per verificare se qualcosa è un numero è il controllo "uguale al sé": var n = 'a'; if (+n === +n) { // is number }è ~ 3994% più veloce di isNaN nell'ultima versione di Chrome. Vedi il test delle prestazioni qui: jsperf.com/isnan-vs-typeof/5
Kevin Jurkowski il

22
** Avviso ** Questa risposta è errata. Utilizzare a proprio rischio. Esempio:isNaN(1 + false + parseInt("1.do you trust your users?"))
keithpjolley

55

E potresti andare nel modo RegExp:

var num = "987238";

if(num.match(/^-{0,1}\d+$/)){
  //valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid number
}

40
In questo caso, RegExp == cattivo
Joel Coehoorn,

10
Ciò non riesce su numeri esadecimali (0x12, ad esempio), galleggia senza zero iniziale (.42, ad esempio) e numeri negativi.
Ori,

17
@JoelCoehoorn Cura di approfondire il motivo per cui RegExp == cattivo qui? Sembra essere un caso d'uso valido per me.
computrius

6
Esistono più modi di quelli che sembra costruire un numero (i numeri esadecimali in un altro commento sono solo un esempio) e ci sono molti numeri che potrebbero non essere considerati validi (overflow del tipo, troppo preciso, ecc.). Inoltre, regex è sia più lento che più complicato del semplice utilizzo dei meccanismi integrati
Joel Coehoorn,

1
dovrebbe anche corrispondere alla notazione scientifica ... 1e10 ecc.
Joseph Merdrignac,

51

Se stai solo cercando di verificare se una stringa è un numero intero (senza posizioni decimali), regex è un buon modo per andare. Altri metodi come isNaNsono troppo complicati per qualcosa di così semplice.

function isNumeric(value) {
    return /^-{0,1}\d+$/.test(value);
}

console.log(isNumeric('abcd'));         // false
console.log(isNumeric('123a'));         // false
console.log(isNumeric('1'));            // true
console.log(isNumeric('1234567890'));   // true
console.log(isNumeric('-23'));          // true
console.log(isNumeric(1234));           // true
console.log(isNumeric('123.4'));        // false
console.log(isNumeric(''));             // false
console.log(isNumeric(undefined));      // false
console.log(isNumeric(null));           // false

Per consentire solo numeri interi positivi utilizzare questo:

function isNumeric(value) {
    return /^\d+$/.test(value);
}

console.log(isNumeric('123'));          // true
console.log(isNumeric('-23'));          // false

11
console.log (isNumeric ( '- 1'));
yongnan,

5
console.log (isNumeric ( '2e2'));
Gaël Barbin,

11
Forse basta rinominare "isNumeric" in "hasOnlyDigits". in molti casi, questo è esattamente il controllo che stai cercando.
gus3001,

1
Questo è quello che stavo cercando, l'equivalente di php ctype_digit
Miguel Pynto,

/^-?\d+$/destra?
Sukima,

36

Se davvero si vuole fare in modo che una stringa contiene solo un numero, un numero qualsiasi (numero intero o in virgola mobile), ed esattamente un numero, non è possibile utilizzare parseInt()/ parseFloat(), Number()o !isNaN()da soli. Nota che in !isNaN()realtà sta tornando truequando Number()restituirebbe un numero e falsequando ritornerebbe NaN, quindi lo escluderò dal resto della discussione.

Il problema parseFloat()è che restituirà un numero se la stringa contiene un numero qualsiasi, anche se la stringa non contiene solo ed esattamente un numero:

parseFloat("2016-12-31")  // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2

Il problema Number()è che restituirà un numero nei casi in cui il valore passato non è affatto un numero!

Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0   \t\n\r") // returns 0

Il problema con il rotolamento del proprio regex è che, a meno che non si crei il regex esatto per abbinare un numero in virgola mobile come Javascript lo riconosce, si perderanno casi o si riconosceranno casi in cui non si dovrebbe. E anche se riesci a creare il tuo regex, perché? Esistono modi più semplici per farlo.

Tuttavia, si scopre che Number()(e isNaN()) fa la cosa giusta per ogni caso in cui parseFloat()restituisce un numero quando non dovrebbe, e viceversa. Quindi, per scoprire se una stringa è davvero esattamente e solo un numero, chiama entrambe le funzioni e vedi se entrambe restituiscono true:

function isNumber(str) {
  if (typeof str != "string") return false // we only process strings!
  // could also coerce to string: str = ""+str
  return !isNaN(str) && !isNaN(parseFloat(str))
}

2
Questo restituisce vero quando la stringa ha spazi iniziali o finali. ' 1', '2 'E ' 3 'restituiscono tutte vero.
Rudey,

Aggiungendo qualcosa del genere alla dichiarazione di ritorno si risolverebbe che: &&! / ^ \ S + | \ s + $ / g.test (str)
Ultroman the Tacoman

2
@RuudLenders - la maggior parte delle persone non si preoccuperà se ci sono spazi finali che vengono tagliati per rendere la stringa un numero valido, perché è facile inserire accidentalmente gli spazi extra in molte interfacce.
Ian,

3
Questo è vero nel caso in cui la stringa numerica provenga dall'input dell'utente. Ma ho pensato che dovrei menzionare gli spazi, perché penso che la maggior parte delle persone che hanno bisogno di una isNumberfunzione non abbiano a che fare con le interfacce utente. Inoltre, un buon input numerico non permetterà agli spazi di iniziare.
Rudey,

36

La risposta accettata per questa domanda ha alcuni difetti (come evidenziato da un paio di altri utenti). Questo è uno dei modi più semplici e comprovati per affrontarlo in javascript:

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

Di seguito sono riportati alcuni buoni casi di test:

console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 '));                 // true
console.log(isNumeric('-32.2 '));             // true
console.log(isNumeric(-32.2));                // true
console.log(isNumeric(undefined));            // false

// the accepted answer fails at these tests:
console.log(isNumeric(''));                   // false
console.log(isNumeric(null));                 // false
console.log(isNumeric([]));                   // false

22

Prova la funzione isNan :

La funzione isNaN () determina se un valore è un numero non valido (non un numero).

Questa funzione restituisce true se il valore equivale a NaN. Altrimenti restituisce false.

Questa funzione è diversa dal metodo Number.isNaN () specifico per il numero .

  La funzione isNaN () globale, converte il valore testato in un numero, quindi lo verifica.

Number.isNan () non converte i valori in un numero e non restituirà true per qualsiasi valore che non sia del tipo Numero ...


2
Assicurati di aggiungere un segno di spunta per la stringa vuota. isNaN ('') restituisce false, ma probabilmente in questo caso si desidera che restituisca true.
Michael Haren,

3
isFinite è un controllo migliore - si occupa del caso strano angolo di Infinity
JonnyRaa

3
@MichaelHaren Non abbastanza buono! isNaN()ritorna falseper QUALSIASI stringa contenente solo caratteri di spazi bianchi, inclusi elementi come '\ u00A0'.
Michael

1
ATTENZIONE: non funziona con i valori: null, "" (stringa vuota) e false.
Jenny O'Reilly,

Mi rendo conto che questa risposta è stata data 11 anni fa e pochi minuti prima di quella accettata, ma che piaccia o no, la risposta accettata ha MODO più conversazioni attorno ad essa, quindi questa risposta non aggiunge nulla al rispondere alla domanda. Suggerirei gentilmente di cancellarlo, per evitare di distrarre nuovi lettori. Penso anche che otterrai il badge Disciplinato se lo fai.
Dan Dascalescu,

14

Vecchia domanda, ma mancano diversi punti nelle risposte fornite.

Notazione scientifica.

!isNaN('1e+30')è true, tuttavia nella maggior parte dei casi quando le persone chiedono numeri, non vogliono abbinare cose come 1e+30.

I grandi numeri fluttuanti possono comportarsi in modo strano

Osservare (usando Node.js):

> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>

D'altro canto:

> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>

Quindi, se uno si aspetta String(Number(s)) === s, allora limitare meglio le stringhe a un massimo di 15 cifre (dopo aver omesso gli zeri iniziali).

Infinito

> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>

Detto questo, verificando che la stringa data sia un numero che soddisfi tutti i seguenti elementi:

  • notazione non scientifica
  • conversione prevedibile in Number e ritorno aString
  • finito

non è un compito così facile. Ecco una versione semplice:

  function isNonScientificNumberString(o) {
    if (!o || typeof o !== 'string') {
      // Should not be given anything but strings.
      return false;
    }
    return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
  }

Tuttavia, anche questo è lungi dall'essere completo. Gli zeri iniziali non vengono gestiti qui, ma avvitano il test di lunghezza.


1
"tuttavia nella maggior parte dei casi quando le persone chiedono numeri, non vogliono abbinare cose come 1e + 30" Perché dovresti dirlo? Se qualcuno vuole sapere se una stringa contiene un numero, mi sembra che vorrebbe sapere se contiene un numero e 1e + 30 è un numero. Certamente se stavo testando una stringa per un valore numerico in JavaScript, vorrei che corrispondesse.
Dan Jones,

9

Ho testato e la soluzione di Michael è la migliore. Vota la sua risposta sopra (cerca questa pagina per "Se vuoi davvero assicurarti che una stringa" per trovarla). In sostanza, la sua risposta è questa:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

Funziona per ogni caso di test, che ho documentato qui: https://jsfiddle.net/wggehvp9/5/

Molte delle altre soluzioni falliscono per questi casi limite: '', null, "", true e []. In teoria, potresti usarli, con una corretta gestione degli errori, ad esempio:

return !isNaN(num);

o

return (+num === +num);

con una gestione speciale per / \ s /, null, "", true, false, [] (e altri?)


1
Ciò ritorna ancora vero con spazi finali / iniziali. L'aggiunta di qualcosa del genere alla dichiarazione di ritorno risolverebbe questo: &&! / ^ \ S + | \ s + $ / g.test (str)
Ultroman the Tacoman

2
Quindi '123' dovrebbe essere falso, non un numero, mentre '1234' dovrebbe essere un numero? Mi piace com'è, quindi "123" è un numero, ma ciò può essere a discrezione dello sviluppatore se gli spazi iniziali o finali devono modificare il valore.
JohnP2,

8

È possibile utilizzare il risultato di Numero quando si passa un argomento al suo costruttore.

Se l'argomento (una stringa) non può essere convertito in un numero, restituisce NaN, quindi è possibile determinare se la stringa fornita fosse o meno un numero valido.

Note: Nota quando passa stringa vuota o '\t\t'e '\n\t'come numero tornerà 0; Il passaggio true restituirà 1 e false restituirà 0.

    Number('34.00') // 34
    Number('-34') // -34
    Number('123e5') // 12300000
    Number('123e-5') // 0.00123
    Number('999999999999') // 999999999999
    Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
    Number('0xFF') // 255
    Number('Infinity') // Infinity  

    Number('34px') // NaN
    Number('xyz') // NaN
    Number('true') // NaN
    Number('false') // NaN

    // cavets
    Number('    ') // 0
    Number('\t\t') // 0
    Number('\n\t') // 0

Il Numbercostruttore è esattamente lo stesso di +x.
GregRos,

Come nota a Number()Number.parseFloat()Number.parseInt()
margine

7

Forse ci sono una o due persone che incontrano questa domanda che hanno bisogno di un controllo molto più rigoroso del solito (come ho fatto io). In tal caso, questo potrebbe essere utile:

if(str === String(Number(str))) {
  // it's a "perfectly formatted" number
}

Attenzione! Questo rifiuterà stringhe come .1, 40.000, 080, 00.1. È molto esigente - la stringa deve corrispondere alla " forma perfetta più minimale " del numero per superare questo test.

Utilizza il costruttore Stringe Numberper eseguire il cast della stringa in un numero e viceversa e quindi controlla se la "forma minima perfetta" del motore JavaScript (quella in cui è stata convertita con il Numbercostruttore iniziale ) corrisponde alla stringa originale.


2
Grazie @JoeRocc. Avevo bisogno di questo anche, ma solo per gli interi, così ho aggiunto: (str === String(Math.round(Number(str)))).
keithpjolley

Tieni presente che "Infinity", "-Infinity"e "NaN"supera questo test. Tuttavia, questo può essere risolto utilizzando un Number.isFinitetest aggiuntivo .
GregRos,

Questo è esattamente lo stesso di str === ("" + +str). In pratica controlla se la stringa è il risultato della stringa di un numero JS. Sapendo questo, possiamo anche vedere un problema: il test passa 0.000001ma fallisce 0.0000001, quando 1e-7invece passa. Lo stesso per numeri molto grandi.
GregRos,


4

Citazione:

isNaN (num) // restituisce true se la variabile NON contiene un numero valido

non è del tutto vero se è necessario verificare la presenza di spazi iniziali / finali, ad esempio quando è richiesta una determinata quantità di cifre e è necessario ottenere, ad esempio, "1111" e non "111" o "111", forse per un PIN ingresso.

Meglio usare:

var num = /^\d+$/.test(num)

I valori '-1', '0.1'e '1e10'tutto falso di ritorno. Inoltre, i valori maggiori dell'infinito positivo o inferiori all'infinito negativo restituiscono vero, mentre probabilmente dovrebbero restituire falso.
Rudey,

4

Perché l'implementazione di jQuery non è abbastanza buona?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

Michael ha suggerito qualcosa del genere (anche se ho rubato qui la versione modificata di "user1691651 - John"):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

Quella che segue è una soluzione con molto probabilmente cattive prestazioni, ma risultati concreti. È un aggeggio fatto dall'implementazione di jQuery 1.12.4 e dalla risposta di Michael, con un controllo extra per gli spazi iniziali / finali (perché la versione di Michael ritorna vera per i numeri con spazi iniziali / finali):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

Tuttavia, quest'ultima versione ha due nuove variabili. Si potrebbe aggirare uno di questi, facendo:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

Non ho ancora testato nessuno di questi, con altri metodi che testare manualmente i pochi casi d'uso che colpirò con la mia situazione attuale, che è tutta roba molto standard. Questa è una situazione "in piedi sulle spalle dei giganti".


4

Non è valido per TypeScript come:

declare function isNaN(number: number): boolean;

Per TypeScript puoi usare:

/^\d+$/.test(key)


3

Bene, sto usando questo che ho fatto ...

Ha funzionato finora:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

Se riscontri qualche problema, dimmelo, per favore.


12
Ciò fornisce il risultato errato per la stringa vuota, l'array vuoto, false e null.
Ori,

2
Non dovrebbe essere un triplo uguale?
toasted_flakes

1
Nella mia applicazione consentiamo solo az AZ e 0-9 caratteri. Ho trovato quanto sopra funzionato a meno che la stringa non iniziasse con 0xnn e quindi la restituisse come numerica quando non avrebbe dovuto. Ho pubblicato un commento qui sotto in modo che la formattazione sia intatta.
rwheadon,

6
potresti semplicemente fare 'return value% 1 === 0'
Brian Schermerhorn,

Basta farereturn !isNaN(parseInt(value, 10));
DarkNeuron il

3

Se qualcuno arriva così in basso, ho passato un po 'di tempo a fare questo hacker cercando di correggere moment.js ( https://github.com/moment/moment ). Ecco qualcosa che ho tolto da esso:

function isNumeric(val) {
    var _val = +val;
    return (val !== val + 1) //infinity check
        && (_val === +val) //Cute coercion check
        && (typeof val !== 'object') //Array/object check
}

Gestisce i seguenti casi:

Vero! :

isNumeric("1"))
isNumeric(1e10))
isNumeric(1E10))
isNumeric(+"6e4"))
isNumeric("1.2222"))
isNumeric("-1.2222"))
isNumeric("-1.222200000000000000"))
isNumeric("1.222200000000000000"))
isNumeric(1))
isNumeric(0))
isNumeric(-0))
isNumeric(1010010293029))
isNumeric(1.100393830000))
isNumeric(Math.LN2))
isNumeric(Math.PI))
isNumeric(5e10))

Falso! :

isNumeric(NaN))
isNumeric(Infinity))
isNumeric(-Infinity))
isNumeric())
isNumeric(undefined))
isNumeric('[1,2,3]'))
isNumeric({a:1,b:2}))
isNumeric(null))
isNumeric([1]))
isNumeric(new Date()))

Ironia della sorte, quello con cui sto lottando di più:

isNumeric(new Number(1)) => false

Eventuali suggerimenti sono benvenuti. :]


2
Che dire di isNumeric(' ')e isNumeric('')?
Alex Cory,

Vorrei aggiungere && (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Numberal fine di risolvere il problema di cui sopra e uno che ho avuto me stesso.
Frankenapps,


3
function isNumberCandidate(s) {
  const str = (''+ s).trim();
  if (str.length === 0) return false;
  return !isNaN(+str);
}

console.log(isNumberCandidate('1'));       // true
console.log(isNumberCandidate('a'));       // false
console.log(isNumberCandidate('000'));     // true
console.log(isNumberCandidate('1a'));      // false 
console.log(isNumberCandidate('1e'));      // false
console.log(isNumberCandidate('1e-1'));    // true
console.log(isNumberCandidate('123.3'));   // true
console.log(isNumberCandidate(''));        // false
console.log(isNumberCandidate(' '));       // false
console.log(isNumberCandidate(1));         // true
console.log(isNumberCandidate(0));         // true
console.log(isNumberCandidate(NaN));       // false
console.log(isNumberCandidate(undefined)); // false
console.log(isNumberCandidate(null));      // false
console.log(isNumberCandidate(-1));        // true
console.log(isNumberCandidate('-1'));      // true
console.log(isNumberCandidate('-1.2'));    // true
console.log(isNumberCandidate(0.0000001)); // true
console.log(isNumberCandidate('0.0000001')); // true
console.log(isNumberCandidate(Infinity));    // true
console.log(isNumberCandidate(-Infinity));    // true

console.log(isNumberCandidate('Infinity'));  // true

if (isNumberCandidate(s)) {
  // use +s as a number
  +s ...
}

Grazie, ottima risposta!
M.Abulsoud,

3

2019: inclusi ES3, ES6 ed esempi TypeScript

Forse questo è stato riproposto troppe volte, tuttavia ho combattuto anche con questo oggi e volevo pubblicare la mia risposta, poiché non ho visto nessun'altra risposta che lo fa in modo semplice o completo:

ES3

var isNumeric = function(num){
    return (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);  
}

ES6

const isNumeric = (num) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);

Dattiloscritto

const isNumeric = (num: any) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num as number);

Questo sembra abbastanza semplice e copre tutte le basi che ho visto su molti altri post e ho pensato:

// Positive Cases
console.log(0, isNumeric(0) === true);
console.log(1, isNumeric(1) === true);
console.log(1234567890, isNumeric(1234567890) === true);
console.log('1234567890', isNumeric('1234567890') === true);
console.log('0', isNumeric('0') === true);
console.log('1', isNumeric('1') === true);
console.log('1.1', isNumeric('1.1') === true);
console.log('-1', isNumeric('-1') === true);
console.log('-1.2354', isNumeric('-1.2354') === true);
console.log('-1234567890', isNumeric('-1234567890') === true);
console.log(-1, isNumeric(-1) === true);
console.log(-32.1, isNumeric(-32.1) === true);
console.log('0x1', isNumeric('0x1') === true);  // Valid number in hex
// Negative Cases
console.log(true, isNumeric(true) === false);
console.log(false, isNumeric(false) === false);
console.log('1..1', isNumeric('1..1') === false);
console.log('1,1', isNumeric('1,1') === false);
console.log('-32.1.12', isNumeric('-32.1.12') === false);
console.log('[blank]', isNumeric('') === false);
console.log('[spaces]', isNumeric('   ') === false);
console.log('null', isNumeric(null) === false);
console.log('undefined', isNumeric(undefined) === false);
console.log([], isNumeric([]) === false);
console.log('NaN', isNumeric(NaN) === false);

Puoi anche provare il tuo isNumeric funzione e appena passato in questi casi d'uso e scansionare "vero" per tutti loro.

Oppure, per vedere i valori che ognuno restituisce:

Risultati di ciascun test con <code> isNumeric () </code>


3

2019: controllo numerico pratico e rigoroso

Spesso, un "numero valido" indica un numero Javascript che esclude NaN e Infinity, ovvero un "numero finito".

Per verificare la validità numerica di un valore (ad esempio da una fonte esterna), è possibile definire in stile ESlint Airbnb:

/**
 * Returns true if 'candidate' is a finite number or a string referring (not just 'including') a finite number
 * To keep in mind:
 *   Number(true) = 1
 *   Number('') = 0
 *   Number("   10  ") = 10
 *   !isNaN(true) = true
 *   parseFloat('10 a') = 10
 *
 * @param {?} candidate
 * @return {boolean}
 */
function isReferringFiniteNumber(candidate) {
  if (typeof (candidate) === 'number') return Number.isFinite(candidate);
  if (typeof (candidate) === 'string') {
    return (candidate.trim() !== '') && Number.isFinite(Number(candidate));
  }
  return false;
}

e usalo in questo modo:

if (isReferringFiniteNumber(theirValue)) {
  myCheckedValue = Number(theirValue);
} else {
  console.warn('The provided value doesn\'t refer to a finite number');
}

2

PFB la soluzione di lavoro:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }

2

Salva te stesso il mal di testa nel tentativo di trovare una soluzione "integrata".

Non c'è una buona risposta e la risposta enormemente votata in questo thread è sbagliata.

npm install is-number

In JavaScript, non è sempre così semplice come dovrebbe essere per verificare in modo affidabile se un valore è un numero. È comune per gli sviluppatori usare +, - o Number () per trasmettere un valore di stringa a un numero (ad esempio, quando i valori vengono restituiti dall'input dell'utente, corrispondenze regex, parser, ecc.). Ma ci sono molti casi limite non intuitivi che producono risultati inaspettati:

console.log(+[]); //=> 0
console.log(+''); //=> 0
console.log(+'   '); //=> 0
console.log(typeof NaN); //=> 'number'

1

Di recente ho scritto un articolo su come garantire che una variabile sia un numero valido: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md L'articolo spiega come garantire il virgola mobile o intero, se è importante ( +xvs~~x ).

L'articolo presuppone che la variabile sia a stringo a numberper cominciare ed trimè disponibile / polifilata. Non sarebbe difficile estenderlo per gestire anche altri tipi. Ecco la carne di esso:

// Check for a valid float
if (x == null
    || ("" + x).trim() === ""
    || isNaN(+x)) {
    return false;  // not a float
}

// Check for a valid integer
if (x == null
    || ("" + x).trim() === ""
    || ~~x !== +x) {
    return false;  // not an integer
}

1

Il mio tentativo di un po 'di confusione, Pherhaps non è la soluzione migliore

function isInt(a){
    return a === ""+~~a
}


console.log(isInt('abcd'));         // false
console.log(isInt('123a'));         // false
console.log(isInt('1'));            // true
console.log(isInt('0'));            // true
console.log(isInt('-0'));           // false
console.log(isInt('01'));           // false
console.log(isInt('10'));           // true
console.log(isInt('-1234567890'));  // true
console.log(isInt(1234));           // false
console.log(isInt('123.4'));        // false
console.log(isInt(''));             // false

// other types then string returns false
console.log(isInt(5));              // false
console.log(isInt(undefined));      // false
console.log(isInt(null));           // false
console.log(isInt('0x1'));          // false
console.log(isInt(Infinity));       // false

Non è male, due male non funziona per nessuna notazione non decimale, come (1) notazione scientifica e (2) notazione non base-10, come ottale ( 042) ed esadecimale ( 0x45f)
Domi

Questo non risponde alla domanda di cercare un valore numerico, cerca solo un int.
Jeremy,

0

Nella mia applicazione consentiamo solo az AZ e 0-9 caratteri. Ho trovato la risposta sopra usando " stringa % 1 === 0" funzionava a meno che la stringa non iniziasse con 0xnn (come 0x10) e poi l'avrebbe restituita come numero quando non lo volevamo. La seguente semplice trappola nel mio controllo numerico sembra fare il trucco nei nostri casi specifici.

function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

Avvertenza : questo potrebbe sfruttare un bug di vecchia data in Javascript e Actionscript [Number ("1" + the_string)% 1 === 0)], non posso parlarne, ma è esattamente ciò di cui avevamo bisogno.


Perché sarebbe un bug in JavaScript?
Bergi,

Semplicemente non vedo lo stesso comportamento con una soluzione simile in perl o C, e poiché non sono uno sviluppatore del linguaggio di programmazione per javascript o actionscript non so se il comportamento che sto vivendo sia veramente intenzionale o meno.
rwheadon,

Bene, JavaScript è un po 'sciatto riguardo al casting di tipo implicito, ma una volta che sai che puoi facilmente capire come funziona. Stai lanciando stringhe su numeri (invocando l' % 1operazione numerica su di essi), e questo interpreterà la stringa come un valore esadecimale o float.
Bergi,

0

La mia soluzione:

// returns true for positive ints; 
// no scientific notation, hexadecimals or floating point dots

var isPositiveInt = function(str) { 
   var result = true, chr;
   for (var i = 0, n = str.length; i < n; i++) {
       chr = str.charAt(i);
       if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
         result = false;
         break;
       };
       if (i == 0 && (chr == "0" || chr == ",")) {  //should not start with 0 or ,
         result = false;
         break;
       };
   };
   return result;
 };

È possibile aggiungere condizioni aggiuntive all'interno del loop, per adattarsi a esigenze particolari.


0

È possibile utilizzare tipi, come con la libreria di flusso y, per ottenere un controllo statico del tempo di compilazione. Ovviamente non estremamente utile per l'input dell'utente.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!

0

Ecco una riga per verificare se sNumè un valore numerico valido; è stato testato per un'ampia varietà di input:

!isNaN(+s.replace(/\s|\$/g, ''));  // returns True if numeric value

0

Basta usare isNaN(), questo convertirà la stringa in un numero e se ottieni un numero valido , restituirà false...

isNaN("Alireza"); //return true
isNaN("123"); //return false

0

Sto usando il seguente:

const isNumber = s => !isNaN(+s)

Funziona abbastanza bene è molti casi, ma non riesce casi come 1..1, 1,1, -32.1.12, e non riesce più importante undefinede NaN. Se lo hai superato undefinedo NaNse questo ti restituisse un falso positivo dicendo che era un numero.
Jeremy,
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.