1826 Stimmen

Wie kann ich prüfen, ob eine Zeichenkette eine gültige Zahl ist?

Ich hoffe, dass es etwas gibt, das sich im gleichen konzeptionellen Rahmen bewegt wie das alte VB6 IsNumeric() Funktion?

0voto

c7x43t Punkte 264

Hier ist eine High-Performance (2.5*10^7 Iterationen/s @3.8GHz Haswell) Version einer isNumber Implementierung. Es funktioniert für jeden Testfall, den ich finden konnte (einschließlich Symbols):

var isNumber = (function () {
  var isIntegerTest = /^\d+$/;
  var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
  function hasLeading0s (s) {
    return !(typeof s !== 'string' ||
    s.length < 2 ||
    s[0] !== '0' ||
    !isDigitArray[s[1]] ||
    isIntegerTest.test(s));
  }
  var isWhiteSpaceTest = /\s/;
  return function isNumber (s) {
    var t = typeof s;
    var n;
    if (t === 'number') {
      return (s <= 0) || (s > 0);
    } else if (t === 'string') {
      n = +s;
      return !((!(n <= 0) && !(n > 0)) || n === '0' || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
    } else if (t === 'object') {
      return !(!(s instanceof Number) || ((n = +s), !(n <= 0) && !(n > 0)));
    }
    return false;
  };
})();

0voto

What Would Be Cool Punkte 5237

Sie können Typen verwenden, wie bei der Durchflussbibliothek y, um eine statische Überprüfung zur Kompilierzeit zu erhalten. Natürlich nicht furchtbar nützlich für Benutzereingaben.

// @flow

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

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

0voto

GoTo Punkte 4685

Meine Lösung:

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

Sie können zusätzliche Bedingungen innerhalb der Schleife hinzufügen, um Ihren besonderen Bedürfnissen gerecht zu werden.

0voto

ekerner Punkte 5354

Test, ob eine Zeichenkette oder eine Zahl eine Zahl ist

const isNumeric = stringOrNumber =>
  stringOrNumber == 0 || !!+stringOrNumber;

Oder wenn Sie eine Zeichenkette oder eine Zahl in eine Zahl umwandeln wollen

const toNumber = stringOrNumber =>
  stringOrNumber == 0 || +stringOrNumber ? +stringOrNumber : NaN;

0voto

rwheadon Punkte 241

In meiner Anwendung sind nur die Zeichen a-z A-Z und 0-9 erlaubt. Ich habe die obige Antwort gefunden, indem ich " String % 1 === 0" funktionierte, es sei denn, die Zeichenkette begann mit 0xnn (z. B. 0x10), und dann würde sie als numerisch zurückgegeben, obwohl wir das nicht wollten. Die folgende einfache Falle in meiner numerischen Prüfung scheint den Trick in unseren speziellen Fällen zu tun.

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

Warnung : Damit wird möglicherweise ein seit langem bestehender Fehler in Javascript und Actionscript ausgenutzt [Number("1" + the_string) % 1 === 0)], dafür kann ich nicht sprechen, aber es ist genau das, was wir brauchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X