Frage Gibt es einen (eingebauten) Weg in JavaScript, um zu überprüfen, ob eine Zeichenkette eine gültige Nummer ist?


Ich hoffe, dass es etwas im selben konzeptionellen Raum wie die alte VB6 IsNumeric () - Funktion gibt?


799
2017-10-06 19:12


Ursprung


Antworten:


Um zu überprüfen, ob eine Variable (einschließlich einer Zeichenfolge) eine Zahl ist, überprüfen Sie, ob es sich um eine Zahl handelt:

Dies funktioniert unabhängig davon, ob die Variable eine Zeichenfolge oder eine Zahl enthält.

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

Beispiele

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

Natürlich können Sie dies bei Bedarf auch negieren. Zum Beispiel, um das zu implementieren IsNumeric Beispiel, das du gegeben hast:

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

So wandeln Sie eine Zeichenfolge mit einer Zahl in eine Zahl um:

funktioniert nur, wenn die Zeichenfolge nur enthält numerische Zeichen, sonst wird es zurückgegeben NaN.

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

Beispiele

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

Um eine Zeichenfolge locker in eine Zahl zu konvertieren

nützlich für die Umwandlung von '12px' in 12, zum Beispiel:

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

Beispiele

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. 

Schwimmt

Bedenken Sie, dass, anders als +num, parseInt (wie der Name schon sagt) wird ein Float in eine ganze Zahl umgewandelt, indem alles, das dem Dezimalpunkt folgt, abgeschnitten wird (wenn Sie es verwenden wollen) parseInt()  durch dieses Verhalten, Sie sind wahrscheinlich besser dran, stattdessen eine andere Methode zu verwenden):

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

Leere Saiten

Leere Zeichenfolgen können etwas kontraintuitiv sein. +num wandelt leere Zeichenfolgen in null und isNaN() nimmt dasselbe an:

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

Aber parseInt() stimmt nicht zu:

parseInt('')       // NaN

1667
2017-10-06 19:24



Und Sie könnten den RegExp-Weg gehen:

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
}

35
2017-10-06 19:20



Probieren Sie die isNan Funktion:

Die isNaN () - Funktion bestimmt, ob ein Wert eine ungültige Nummer (Not-a-Number) ist.

Diese Funktion gibt true zurück, wenn der Wert NaN entspricht. Andernfalls wird false zurückgegeben.

Diese Funktion unterscheidet sich von der Nummer spezifisch Nummer.isNaN () Methode.

Die globale Funktion isNaN () konvertiert den getesteten Wert in eine Zahl und testet sie dann.

Number.isNan () konvertiert die Werte nicht in eine Zahl und gibt für keinen Wert, der nicht vom Typ Number ist, keinen Wert zurück.


21
2017-10-06 19:14



Wenn Sie wirklich sicherstellen wollen, dass eine Zeichenfolge nur eine Zahl, eine beliebige Zahl (Ganzzahl oder Gleitkommazahl) und genau eine Zahl enthält, dann kann nicht benutzen parseInt()/ parseFloat(), Number(), oder !isNaN() selbst. Beachten Sie, dass !isNaN() kommt tatsächlich zurück true wann Number() würde eine Zahl zurückgeben, und false wenn es zurückkehren würde NaNAlso werde ich es vom Rest der Diskussion ausschließen.

Das Problem mit parseFloat() ist, dass es eine Zahl zurückgibt, wenn die Zeichenfolge eine Zahl enthält, auch wenn die Zeichenfolge nicht enthalten ist nur und genau eine Zahl:

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

Das Problem mit Number() ist, dass es eine Zahl zurückgibt, wenn der übergebene Wert überhaupt keine Zahl ist!

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

Das Problem mit Ihrer eigenen Regex ist, dass, wenn Sie die exakte Regex für die Entsprechung einer Gleitkommazahl nicht erstellen, wie Javascript erkennt, Sie Fälle verpassen werden oder Fälle erkennen, wo Sie nicht sollten. Und selbst wenn Sie Ihren eigenen Regex rollen können, warum? Es gibt einfachere integrierte Möglichkeiten, dies zu tun.

Es stellt sich jedoch heraus, dass Number() (und isNaN()) macht für jeden Fall das Richtige parseFloat()gibt eine Zahl zurück, wenn dies nicht der Fall ist, und umgekehrt. Um herauszufinden, ob eine Zeichenfolge wirklich genau und nur eine Zahl ist, rufen Sie beide Funktionen auf und prüfen Sie, ob sie vorhanden sind beide zurück wahr:

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))
}

20
2018-03-02 22:56



Wenn Sie nur versuchen zu überprüfen, ob eine Zeichenfolge eine ganze Zahl ist (keine Dezimalstellen), ist Regex ein guter Weg zu gehen. Andere Methoden wie z isNaN sind zu kompliziert für etwas so einfaches.

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

Nur erlauben positiv ganze Zahlen verwenden das:

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

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

17
2018-06-27 17:13



Alte Frage, aber in den gegebenen Antworten fehlen einige Punkte.

Wissenschaftliche Schreibweise.

!isNaN('1e+30') ist trueIn den meisten Fällen, in denen die Leute nach Zahlen fragen, wollen sie keine ähnlichen Dinge finden 1e+30.

Große schwebende Zahlen können sich seltsam verhalten

Beobachten (mit 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
>

Andererseits:

> 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
>

Also, wenn man es erwartet String(Number(s)) === s, dann beschränke deine Strings am besten auf 15 Ziffern (nach dem Weglassen führender Nullen).

Unendlichkeit

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

Bei alldem prüfen, ob die angegebene Zeichenfolge eine Zahl ist, die alle folgenden Bedingungen erfüllt:

  • nicht wissenschaftliche Notation
  • vorhersagbare Konvertierung zu Number und zurück zu String
  • endlich

ist keine so einfache Aufgabe. Hier ist eine einfache Version:

  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);
  }

Aber auch dieses ist noch lange nicht vollständig. Führende Nullen werden hier nicht behandelt, aber sie verschrauben den Längentest.


10
2017-10-02 11:28



parseInt (), aber sei dir bewusst, dass diese Funktion ein bisschen anders in dem Sinne ist, dass sie zum Beispiel 100 für parseInt ("100px") zurückgibt.


5
2017-10-06 19:16