Come posso verificare che un numero sia float o intero?


717

Come scoprire che un numero è floato integer?

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

47
Capisco quello che stai chiedendo qui, ma solo per essere chiari: <nit-pick>JavaScript non ha diversi tipi numerici interi e float. Ogni numero in JavaScript è solo un Number. </nit-pick>
Matt Ball,

4
È Infinityun valore intero o non intero per quanto ti riguarda? Le risposte qui sono distribuite in modo abbastanza uniforme su questo punteggio.
Mike Samuel,

11
@MikeSamuel Per essere matematicamente accurati: poiché l'infinito non è un numero reale e tutti i numeri interi sono numeri reali, Infinitynon può essere considerato un numero intero.
rvighne,

@rvighne, La domanda è "float", non "reale". In ogni caso, i reali sono irrilevanti perché i computer possono rappresentare solo numeri calcolabili .
Mike Samuel,

2
@rvighne, penso che siamo d'accordo sul fatto che l'infinito e la NaN non siano numeri reali significa che i float IEEE-754 non sono un sottoinsieme di numeri reali. Tutte le analisi numeriche basate su IEEE-754 devono affrontare questo fatto. Quello che non capisco è come pensi che questo fatto determini come is_integral dovrebbe comportarsi con le cardinalità. Personalmente, penso che ((x% 1) == 0) sia un buon proxy ed è completamente specificato da IEEE-754, quindi non c'è bisogno di discutere delle corrispondenze tra le diverse linee numeriche.
Mike Samuel,

Risposte:


1256

cerca un resto quando dividi per 1:

function isInt(n) {
   return n % 1 === 0;
}

Se non sai che l'argomento è un numero, hai bisogno di due test:

function isInt(n){
    return Number(n) === n && n % 1 === 0;
}

function isFloat(n){
    return Number(n) === n && n % 1 !== 0;
}

Aggiornamento 2019 5 anni dopo la stesura di questa risposta, una soluzione è stata standardizzata in ECMA Script 2015. Tale soluzione è trattata in questa risposta .


138
Attenzione, questo tornerà anche vero per una stringa vuota, una stringa che rappresenta un numero intero, true, false, null, un array vuoto, una matrice contenente un singolo numero intero, un array contenente una stringa che rappresenta un numero intero, e forse più.
Dagg Nabbit,

17
Bel trucco ma non la risposta corretta in quanto non riesce a controllare la stringa vuota ""e 1.0 isInt("");&& isInt(1.0);entrambi danno come risultato truevedere questa demo jsbin.com/elohuq/1/edit
Champ

9
Ina, l'uso di === è incoraggiato su == in generale, perché porta a una maggiore sicurezza del tipo e un comportamento più prevedibile e uniforme. Come hanno affermato i precedenti risponditori, questa risposta è assolutamente errata al 100%. I valori null, stringa vuota, 1.0 e numerosi altri verranno registrati erroneamente come numeri interi (anche con il controllo ===).
Whoblitz,

54
La domanda era come verificare se un numero è un numero intero, non come controllare alcun valore.
Kennebec,

24
Molti commenti ostili su come non convalida le stringhe. Non fa parte della domanda del PO. Se vado su SO per fare una domanda sul recupero dell'ultimo elemento di un array e qualcuno risponde function last (array) { return array[array.length - 1]; }, è "solo sbagliato" o "Peggior risposta su SO" perché non controlla se l'argomento è prima un array? Sì, buona pratica per verificare gli argomenti, ma è responsabilità dello sviluppatore. Le risposte SO dovrebbero essere brevi e rispondere direttamente alla domanda nel modo più chiaro possibile.
M Miller,

150

Prova queste funzioni per verificare se un valore è un valore primitivo numerico che non ha una parte frazionaria e rientra nei limiti di dimensione di ciò che può essere rappresentato come un intero esatto.

function isFloat(n) {
    return n === +n && n !== (n|0);
}

function isInteger(n) {
    return n === +n && n === (n|0);
}

5
eh, grande sfruttamento, è praticamente mio ( n===+nper verificare la presenza di numeri, n|0arrotondare), ma con operatori integrati. funky
Claudiu,

7
@ John Hartsock una stringa non sarà mai un valore numerico. È una stringa. Il punto di questa funzione è verificare se un valore è un valore numerico Javascript che non ha una parte frazionaria e rientra nei limiti di dimensione di ciò che può essere rappresentato come un intero esatto. Se vuoi controllare una stringa per vedere se contiene una sequenza di caratteri che rappresentano un numero, dovresti chiamare per parseFloat()primo.
Punta

4
@ John Hartsock: non tornerà vero a meno che non sia stata passata una primitiva numerica. Penso che abbia un senso dato i nomi delle funzioni. Qualsiasi altra cosa dovrebbe essere un candidato per isString, isBoolean, ecc. Se tali funzioni vengono scritte.
Dagg Nabbit,

4
@Pointy: i float a doppia precisione possono rappresentare valori interi esattamente fino a 2 ^ 53. Quindi dipende se l'OP chiedeva numeri interi nel senso matematico (numeri interi) o nel senso dei dati a 32 bit. Se è quest'ultimo, la tua soluzione è perfetta.
djd

8
in javascript, operatori bit a bit come |(OR) operano solo su numeri interi a 32 bit con segno. OP non indica se l'obiettivo è verificare i valori int32 firmati. Quindi questo non funzionerà con numeri fuori range. isInteger(5000000000)tornerà falseche è sbagliato!
Onur Yıldırım,

93

Perché non qualcosa del genere:

var isInt = function(n) { return parseInt(n) === n };

Questo è in realtà il nucleo di una buona soluzione per me. Avevo bisogno di consentire numeri interi positivi e non consentire float, stringhe e numeri interi negativi.
Imran-UK,

4
Questa sembra una soluzione di gran lunga migliore rispetto alle altre in questo thread. La comunità potrebbe offrire qualche critica, forse?
sbichenko,

5
var y = 1.00; y === parseInt (y, 10); // questo per me è vero, il che non è proprio quello che vogliamo.
whoughton,

L'unico "aspetto negativo" che vedo è che il numero dato nviene convertito in una stringa da parseInt. Vedi MDN . Ma userò questa soluzione. :)
RhinoDevel,

2
@ekussberg: perché dovrebbe restituire false? 1 è un int. e 02, il secondo argomento, viene ignorato.
Flimzy,

88

C'è un metodo chiamato Number.isInteger()che è attualmente implementato in tutto tranne IE. MDN fornisce anche un polyfill per altri browser:

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

Tuttavia, per la maggior parte dei casi di utilizzo, è meglio utilizzare, Number.isSafeInteger che controlla anche se il valore è così alto / basso che eventuali cifre decimali sarebbero andate perse comunque. MDN ha un polyfil anche per questo. (Hai anche bisogno del isIntegerpollyfill sopra.)

if (!Number.MAX_SAFE_INTEGER) {
    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};

Questo funziona anche nel mio Chrome ora e probabilmente la strada da percorrere in futuro
Dukeatcoding

1
Secondo me la soluzione migliore.
Automatico,

1
Questo con il polyfill è la soluzione più affidabile e semplice.
Francesco Pasa,

2
@SergeyPanfilov 12.0 ∈ ℤ.
Константин Ван,

1
Non sono a conoscenza se le specifiche sono cambiate da quando è stata fornita questa risposta, ma nota che la funzione sopra non è un polyfill corretto per Number.isInteger. È, tuttavia, un polyfill corretto per Number.isSafeInteger. Number.isIntegernon dovrebbe verificare se il numero è un "numero intero sicuro". Vedi su MDN: isInteger e isSafeInteger .
nunocastromartins,

33

Puoi usare una semplice espressione regolare:

function isInt(value) {

    var er = /^-?[0-9]+$/;

    return er.test(value);
}

Oppure puoi usare anche le seguenti funzioni, in base alle tue esigenze. Sono sviluppati dal progetto PHPJS .

is_int() => Controlla se il tipo di variabile è intero e se il suo contenuto è intero

is_float() => Controlla se il tipo di variabile è float e se il suo contenuto è float

ctype_digit() => Controlla se il tipo di variabile è stringa e se il suo contenuto ha solo cifre decimali

Aggiornamento 1

Ora controlla anche i numeri negativi, grazie per il commento di @ChrisBartley !


1
Perfetto per testare interi senza segno semplici.
tothemario,

7
One liner:/^[0-9]+$/.test(String(value))
tothemario,

One-liner più breve e leggermente meno leggibile:/^[0-9]+$/.test(''+value)
skeggse il

3
Non gestisce numeri interi negativi. Non è necessario nemmeno l'operatore ternario poiché test () restituisce un valore booleano. Questo dovrebbe farlo:return /^-?\d+$/.test(String(value));
Chris Bartley,

@ChrisBartley, grazie! Ho effettuato un aggiornamento, inclusi i tuoi crediti. Si prega di verificare se tutto va bene ora.
Marcio Mazzucato,

19

Ecco alcune funzioni efficienti che controllano se il valore è un numero o possono essere convertiti in modo sicuro in un numero:

function isNumber(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    if (typeof value == 'number') {
        return true;
    }
    return !isNaN(value - 0);
}

E per i numeri interi (restituirebbe false se il valore è float):

function isInteger(value) {
    if ((undefined === value) || (null === value)) {
        return false;
    }
    return value % 1 == 0;
}

L'efficienza qui è che parseInt (o parseNumber) vengono evitati quando il valore è già un numero. Entrambe le funzioni di analisi sempre convertite prima in stringa e quindi tentano di analizzare quella stringa, il che sarebbe uno spreco se il valore è già un numero.

Grazie agli altri post qui per aver fornito ulteriori idee per l'ottimizzazione!


3
Questa funzione ha esito negativo sulla stringa vuota: isNumber ('') è true.
Jason Grout,

14
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; }
function isFloat(x) { return !!(x % 1); }

// give it a spin

isInteger(1.0);        // true
isFloat(1.0);          // false
isFloat(1.2);          // true
isInteger(1.2);        // false
isFloat(1);            // false
isInteger(1);          // true    
isFloat(2e+2);         // false
isInteger(2e+2);       // true
isFloat('1');          // false
isInteger('1');        // false
isFloat(NaN);          // false
isInteger(NaN);        // false
isFloat(null);         // false
isInteger(null);       // false
isFloat(undefined);    // false
isInteger(undefined);  // false

4
Apparentemente, i float che terminano con .0 vengono automaticamente lanciati su Int in JavaScript.

fallito con 1.2. Testare sempre le funzioni numeriche con 0,1 0,2 0,3
Lukas Liesis

@LukasLiesis non fa per me.
doubleOrt

Non è necessario per nessuno degli operatori di uguaglianza rigorosa qui.
doubleOrt

isFloat (1563457121531) restituisce false
Aalex Gabi il

9
function isInt(n) 
{
    return n != "" && !isNaN(n) && Math.round(n) == n;
}
function isFloat(n){
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

funziona per tutti i casi.


2
+1 Questo è buono. isInt('1')ritorna truecome previsto (almeno per me). Abbastanza strano, però, questo torna truea isInt([5])pure. Non importava per me, ma può per te, quindi, abbi cura di te.
acdcjunior,

2
isFloat (12.0) è falso
django il

6

Come altri hanno già detto, hai solo doppie in JS. Quindi, come si definisce un numero intero? Basta controllare se il numero arrotondato è uguale a se stesso:

function isInteger(f) {
    return typeof(f)==="number" && Math.round(f) == f;
}
function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }

3
Potrebbe voler verificare che il valore sia numerico ... isFloat('abc')restituiscetrue
Dagg Nabbit il

isFloat(NaN) // true
shime

@shime: buona cattura. NaN è tecnicamente un numero in virgola mobile però ... dipende dal caso d'uso suppongo.
Claudiu,

6

Che ne dici di questo?

isFloat(num) {
    return typeof num === "number" && !Number.isInteger(num);
}

Prova console.log(isFloat(1.0));risultati falsi.
Fabian Picone,

5

Ecco cosa uso per i numeri interi:

Math.ceil(parseFloat(val)) === val

Breve, carino :) Funziona sempre. Questo è ciò che David Flanagan suggerisce se non sbaglio.


Mi piace questa perché è una risposta breve e semplice che non si basa su operazioni criptiche bit a bit.
Jim,

Perché parseFloat?
doubleOrt

4

Dipende davvero da cosa vuoi ottenere. Se vuoi "emulare" lingue fortemente tipizzate, allora ti suggerisco di non provarci. Come altri hanno già detto, tutti i numeri hanno la stessa rappresentazione (lo stesso tipo).

Utilizzando qualcosa come Claudiu fornito:

isInteger( 1.0 ) -> vero

che sembra buono per il senso comune, ma in qualcosa come C si otterrebbe false


4

Qualsiasi numero Float con una parte decimale zero (ad es. 1.0, 12.00, 0.0) viene implicitamente trasmesso a Integer, quindi non è possibile verificare se sono Float o meno.



3

Non deve essere così complicato. Il valore numerico degli equivalenti parseFloat () e parseInt () di un numero intero sarà lo stesso. Quindi puoi fare così:

function isInt(value){ 
    return (parseFloat(value) == parseInt(value)) && !isNaN(value);
}

Poi

if (isInt(x)) // do work

Ciò consentirà anche il controllo delle stringhe e quindi non è rigoroso. Se vuoi una soluzione di tipo forte (aka, non funzionerà con le stringhe):

function is_int(value){ return !isNaN(parseInt(value * 1) }

isInteger (12.0) è true
django

3
var isInt = function (n) { return n === (n | 0); };

Non ho avuto un caso in cui questo non ha funzionato.


ehi scusa perché questo ritorna falso? console.log (isInt (7932938942839482938));
È l'

4
Perché questo supera MaxInt.
aprile

ma è possibile impostare una lunghezza massima int no? cosa succede se non so che viene restituita la lunghezza int?
itsme

1
@ekussberg Sì perché 2è un numero intero ed 23è considerato un secondo argomento della funzione. In javascript i decimali sono scritti usando il punto come separatore - quindi dovrebbe essere 2.23.
aprile

1
Oppure è un'ottima opportunità per conoscere le operazioni bit per bit. Ne trarrai molti benefici in futuro.
aprile

2

QUESTO È IL CODICE FINALE PER CONTROLLARE SIA INT E GALLEGGIANTE

function isInt(n) { 
   if(typeof n == 'number' && Math.Round(n) % 1 == 0) {
       return true;
   } else {
       return false;
   }
} 

O

function isInt(n) {   
   return typeof n == 'number' && Math.Round(n) % 1 == 0;   
}   

Questo prova solo per float se n sembra essere un numero
hacklikecrack il

2
function isInteger(n) {
   return ((typeof n==='number')&&(n%1===0));
}

function isFloat(n) {
   return ((typeof n==='number')&&(n%1!==0));
}

function isNumber(n) {
   return (typeof n==='number');
}

Un numero intero non è un float? Notizie per me.
Maarten Bodewes,

2

È semplice come:

if( n === parseInt(n) ) ...

Prova questo in console:

x=1;
x===parseInt(x); // true
x="1";
x===parseInt(x); // false
x=1.1;
x===parseInt(x); // false, obviously

// BUT!

x=1.0;
x===parseInt(x); // true, because 1.0 is NOT a float!

Questo confonde molte persone. Ogni volta che qualcosa è 0, non è più un float. È un numero intero. Oppure puoi semplicemente chiamarlo "una cosa numerica" ​​perché non esiste una distinzione rigorosa come allora in C. Bei vecchi tempi.

Quindi, fondamentalmente, tutto ciò che puoi fare è controllare il numero intero accettando il fatto che 1.000 è un numero intero.

Nota a margine interessante

C'è stato un commento su numeri enormi. Numeri enormi non significano NESSUN problema per questo approccio; ogni volta che parseInt non è in grado di gestire il numero (perché è troppo grande) restituirà qualcos'altro rispetto al valore effettivo, quindi il test restituirà FALSE. Questa è una buona cosa perché se consideri qualcosa come un "numero" normalmente ti aspetti che JS sia in grado di calcolare con esso - quindi sì, i numeri sono limitati e analizzeremo questo , per metterlo in questo modo.

Prova questo:

<script>

var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!
var aIsInteger = (a===parseInt(a))?"a is ok":"a fails";
var bIsInteger = (b===parseInt(b))?"b is ok":"b fails";
alert(aIsInteger+"; "+bIsInteger);

</script>

Nel mio browser (IE8) questo restituisce "a is ok; b fail" che è esattamente a causa dell'enorme numero in b. Il limite può variare ma immagino che 20 cifre "dovrebbero essere sufficienti per chiunque", per citare un classico :)


Questo va bene se hai solo bisogno di controllare i numeri integrali (da un POV di matematica), ma se vuoi assicurarti che funzionino effettivamente come numeri interi (da un POV di calcolo) sarà errato per numeri enormi. Vedere questo commento .
Dagg Nabbit il

Mmmmmmm ... Perché lo pensi? Voglio dire, se parseInt restituisce qualcosa e sembra uguale alla variabile stessa, puoi essere sicuro che il tuo n funzioni davvero come un numero intero. Ho scoperto che 9999999999999999999999 (ovvero 20 volte "9") è un numero mentre l'aggiunta di un altro "9" fa fallire l'analisi (restituendo 1). Potrebbe dipendere dal browser; tuttavia, SÌ, c'è un limite e NO, qualunque cosa sia fuori da quel limite non tornerà vera per il controllo sopra.
dkellner,

Quello che voglio dire è che gli operatori bit a bit (che trattano i numeri come in 32 bit) non daranno i risultati previsti su numeri che non possono essere rappresentati come in 32 bit, quindi quei numeri non dovrebbero essere identificati come in. Ciò è in linea con il funzionamento della proposta Number.isInteger.
Dagg Nabbit

Qualcosa può essere un numero intero vero senza essere memorizzato in un modo specifico. Vedo il tuo punto ma i numeri interi sono numeri interi perché non hanno una parte frazionaria e possono essere aggiunti / sottratti arbitrariamente senza ottenere risultati simili a virgola mobile. Se trattate i numeri come bitfield, supponete qualcosa su come sono memorizzati, il che è - a mio avviso - un modo praticamente funzionante ma non affidabile al 100%. Se stai cercando "un numero intero memorizzato in un certo modo", beh, non sono sicuro che ci sia un test a linea singola che puoi tranquillamente utilizzare su tutte le piattaforme.
dkellner

I numeri che possono essere espressi come in 32 bit funzionano in modo affidabile al 100% con gli operatori bit a bit. Non stai "supponendo nulla su come sono memorizzati;" i numeri vengono convertiti in interi di complemento a due bit big endian a 32 bit firmati, per specifica. I numeri che non possono essere rappresentati in questo formato non devono essere considerati numeri interi. Ancora una volta, questo è in linea con il modo in cui Number.isIntegerfunziona. Un test a linea singola è n === (n | 0)come mostrato in un'altra risposta.
Dagg Nabbit,

2

Questa soluzione ha funzionato per me.

<html>
<body>
  <form method="post" action="#">
    <input type="text" id="number_id"/>
    <input type="submit" value="send"/>
  </form>
  <p id="message"></p>
  <script>
    var flt=document.getElementById("number_id").value;
    if(isNaN(flt)==false && Number.isInteger(flt)==false)
    {
     document.getElementById("message").innerHTML="the number_id is a float ";
    }
   else 
   {
     document.getElementById("message").innerHTML="the number_id is a Integer";
   }
  </script>
</body>
</html>

1

Per i numeri interi uso questo

function integer_or_null(value) {
    if ((undefined === value) || (null === value)) {
        return null;
    }
    if(value % 1 != 0) {
        return null;
    }
    return value;
}

1

Nello script java tutti i numeri sono internally 64 bit floating pointuguali al doppio in java. Non ci sono tipi diversi in JavaScript, tutti sono rappresentati dal tipo number. Quindi non sarai in grado di fare un instanceofcontrollo. Tuttavia puoi utilizzare le soluzioni sopra riportate per scoprire se si tratta di un numero frazionario. i progettisti di script Java hanno sentito con un solo tipo che possono evitare numerosi errori di cast di tipo.


1

Alcune volte gli oggetti numerici non ti consentono di utilizzare direttamente l'operatore mod (%), se ti trovi di fronte a quel caso puoi usare questa soluzione.

if(object instanceof Number ){
   if( ((Number) object).doubleValue() % 1 == 0 ){
      //your object is an integer
   }
   else{
      //your object is a double
   }
}

1

Cercando alcune delle risposte qui ho finito per scrivere questa soluzione. Funziona anche con numeri all'interno di una stringa.

function isInt(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return !(number - parseInt(number));
}

function isFloat(number) {
    if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
    return number - parseInt(number) ? true : false;
}

    var tests = {
        'integer' : 1,
        'float' : 1.1,
        'integerInString' : '5',
        'floatInString' : '5.5',
        'negativeInt' : -345,
        'negativeFloat' : -34.98,
        'negativeIntString' : '-45',
        'negativeFloatString' : '-23.09',
        'notValidFalse' : false,
        'notValidTrue' : true,
        'notValidString' : '45lorem',
        'notValidStringFloat' : '4.5lorem',
        'notValidNan' : NaN,
        'notValidObj' : {},
        'notValidArr' : [1,2],
    };

    function isInt(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return !(number - parseInt(number));
    }
    
    function isFloat(number) {
        if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false;
        return number - parseInt(number) ? true : false;
    }

    function testFunctions(obj) {
        var keys = Object.keys(obj);
        var values = Object.values(obj);

        values.forEach(function(element, index){
            console.log(`Is ${keys[index]} (${element}) var an integer? ${isInt(element)}`);
            console.log(`Is ${keys[index]} (${element}) var a float? ${isFloat(element)}`);
        });
    }

    testFunctions(tests);


0

Questo forse non è performante come la risposta%, che ti impedisce di convertirti prima in una stringa, ma non ho ancora visto nessuno pubblicarlo, quindi ecco un'altra opzione che dovrebbe funzionare bene:

function isInteger(num) {
    return num.toString().indexOf('.') === -1;
}

Buon approccio IMHO
Sergei Panfilov

Vorrei aggiungere che il metodo ES6 include () rende questa risposta ancora più semplice
Assale

0

Per i curiosi, usando Benchmark.js ho testato le risposte più votate (e quella pubblicata oggi) su questo post, ecco i miei risultati:

var n = -10.4375892034758293405790;
var suite = new Benchmark.Suite;
suite
    // kennebec
    .add('0', function() {
        return n % 1 == 0;
    })
    // kennebec
    .add('1', function() {
        return typeof n === 'number' && n % 1 == 0;
    })
    // kennebec
    .add('2', function() {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    })

    // Axle
    .add('3', function() {
        return n.toString().indexOf('.') === -1;
    })

    // Dagg Nabbit
    .add('4', function() {
        return n === +n && n === (n|0);
    })

    // warfares
    .add('5', function() {
        return parseInt(n) === n;
    })

    // Marcio Simao
    .add('6', function() {
        return /^-?[0-9]+$/.test(n.toString());
    })

    // Tal Liron
    .add('7', function() {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    });

// Define logs and Run
suite.on('cycle', function(event) {
    console.log(String(event.target));
}).on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').pluck('name'));
}).run({ 'async': true });

0 x 12,832,357 ops/sec ±0.65% (90 runs sampled)
1 x 12,916,439 ops/sec ±0.62% (95 runs sampled)
2 x 2,776,583 ops/sec ±0.93% (92 runs sampled)
3 x 10,345,379 ops/sec ±0.49% (97 runs sampled)
4 x 53,766,106 ops/sec ±0.66% (93 runs sampled)
5 x 26,514,109 ops/sec ±2.72% (93 runs sampled)
6 x 10,146,270 ops/sec ±2.54% (90 runs sampled)
7 x 60,353,419 ops/sec ±0.35% (97 runs sampled)

Fastest is 7 Tal Liron

0

Ecco il mio codice Verifica che non sia una stringa vuota (che altrimenti passerà) e quindi la converte in formato numerico. Ora, a seconda che tu voglia che "1.1" sia uguale a 1.1, questo potrebbe essere o meno quello che stai cercando.

var isFloat = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseFloat(n));
};
var isInteger = function(n) {
    n = n.length > 0 ? Number(n) : false;
    return (n === parseInt(n));
};

var isNumeric = function(n){

   if(isInteger(n) || isFloat(n)){
        return true;
   }
   return false;

};

0

Mi piace questa piccola funzione, che tornerà vera sia per gli interi positivi che per quelli negativi:

function isInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0");
}

Questo funziona perché 1 o "1" diventa "1.0", che isNaN () restituisce false su (che quindi neghiamo e restituiamo), ma 1.0 o "1.0" diventa "1.0.0", mentre "stringa" diventa "stringa. 0 ", nessuno dei quali sono numeri, quindi isNaN () restituisce false (e, di nuovo, viene negato).

Se vuoi solo numeri interi positivi, c'è questa variante:

function isPositiveInt(val) {
    return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val);
}

oppure, per numeri interi negativi:

function isNegativeInt(val) {
    return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val);
}

isPositiveInt () funziona spostando la stringa numerica concatenata davanti al valore da testare. Ad esempio, isPositiveInt (1) risulta in isNaN () che valuta "01", che valuta false. Nel frattempo, isPositiveInt (-1) risulta in isNaN () che valuta "0-1", che valuta vero. Neghiamo il valore di ritorno e questo ci dà ciò che vogliamo. isNegativeInt () funziona in modo simile, ma senza negare il valore restituito di isNaN ().

Modificare:

La mia implementazione originale ritornerebbe vera anche su array e stringhe vuote. Questa implementazione non ha questo difetto. Ha anche il vantaggio di tornare presto se val non è una stringa o un numero o se è una stringa vuota, rendendola più veloce in questi casi. Puoi modificarlo ulteriormente sostituendo le prime due clausole con

typeof(val) != "number"

se vuoi solo abbinare numeri letterali (e non stringhe)

Modificare:

Non posso ancora pubblicare commenti, quindi lo sto aggiungendo alla mia risposta. Il benchmark pubblicato da @Asok è molto informativo; tuttavia, la funzione più veloce non soddisfa i requisiti, poiché restituisce anche VERO per float, array, booleani e stringhe vuote.

Ho creato la seguente suite di test per testare ciascuna delle funzioni, aggiungendo anche la mia risposta all'elenco (funzione 8, che analizza le stringhe e funzione 9, che non lo fa):

funcs = [
    function(n) {
        return n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && n % 1 == 0;
    },
    function(n) {
        return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
    },
    function(n) {
        return n.toString().indexOf('.') === -1;
    },
    function(n) {
        return n === +n && n === (n|0);
    },
    function(n) {
        return parseInt(n) === n;
    },
    function(n) {
        return /^-?[0-9]+$/.test(n.toString());
    },
    function(n) {
        if ((undefined === n) || (null === n)) {
            return false;
        }
        if (typeof n == 'number') {
            return true;
        }
        return !isNaN(n - 0);
    },
    function(n) {
        return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0");
    }
];
vals = [
    [1,true],
    [-1,true],
    [1.1,false],
    [-1.1,false],
    [[],false],
    [{},false],
    [true,false],
    [false,false],
    [null,false],
    ["",false],
    ["a",false],
    ["1",null],
    ["-1",null],
    ["1.1",null],
    ["-1.1",null]
];

for (var i in funcs) {
    var pass = true;
    console.log("Testing function "+i);
    for (var ii in vals) {
        var n = vals[ii][0];
        var ns;
        if (n === null) {
            ns = n+"";
        } else {
            switch (typeof(n)) {
                case "string":
                    ns = "'" + n + "'";
                    break;
                case "object":
                    ns = Object.prototype.toString.call(n);
                    break;
                default:
                    ns = n;
            }
            ns = "("+typeof(n)+") "+ns;
        }

        var x = vals[ii][1];
        var xs;
        if (x === null) {
            xs = "(ANY)";
        } else {
            switch (typeof(x)) {
                case "string":
                    xs = "'" + n + "'";
                    break;
                case "object":
                    xs = Object.prototype.toString.call(x);
                    break;
                default:
                    xs = x;
            }
            xs = "("+typeof(x)+") "+xs;
        }

        var rms;
        try {
            var r = funcs[i](n);
            var rs;
            if (r === null) {
                rs = r+"";
            } else {
                switch (typeof(r)) {
                    case "string":
                        rs = "'" + r + "'";
                        break;
                    case "object":
                        rs = Object.prototype.toString.call(r);
                        break;
                    default:
                        rs = r;
                }
                rs = "("+typeof(r)+") "+rs;
            }

            var m;
            var ms;
            if (x === null) {
                m = true;
                ms = "N/A";
            } else if (typeof(x) == 'object') {
                m = (xs === rs);
                ms = m;
            } else {
                m = (x === r);
                ms = m;
            }
            if (!m) {
                pass = false;
            }
            rms = "Result: "+rs+", Match: "+ms;
        } catch (e) {
            rms = "Test skipped; function threw exception!"
        }

        console.log("    Value: "+ns+", Expect: "+xs+", "+rms);
    }
    console.log(pass ? "PASS!" : "FAIL!");
}

Ho anche eseguito nuovamente il benchmark con la funzione # 8 aggiunta all'elenco. Non pubblicherò il risultato, in quanto sono un po 'imbarazzanti (ad es. Quella funzione NON è veloce) ...

I risultati (abbreviati - ho rimosso i test riusciti, poiché l'output è piuttosto lungo) sono i seguenti:

Testing function 0
Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 1
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 2
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 3
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
FAIL!

Testing function 4
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 5
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 6
Value: null, Expect: (boolean) false, Test skipped; function threw exception!
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 7
Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A
FAIL!

Testing function 8
Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Testing function 9
Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A
PASS!

Ho lasciato degli errori in modo da poter vedere dove fallisce ogni funzione, e il test (#) 'stringa' in modo da poter vedere come ogni funzione gestisce valori interi e float nelle stringhe, poiché alcuni potrebbero volerli analizzati come numeri e alcuni non può.

Delle 10 funzioni testate, quelle che soddisfano effettivamente i requisiti di OP sono [1,3,5,6,8,9]


0

Condizione per la convalida mobile:

if (lnk.value == +lnk.value && lnk.value != (lnk.value | 0)) 

Condizione per la convalida di numeri interi:

if (lnk.value == +lnk.value && lnk.value == (lnk.value | 0)) 

Spero che questo possa essere utile.


0
function int(a) {
  return a - a === 0 && a.toString(32).indexOf('.') === -1
}

function float(a) {
  return a - a === 0 && a.toString(32).indexOf('.') !== -1
}

È possibile aggiungere typeof a === 'number'se si desidera escludere le stringhe.

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.