Überprüfen Sie, ob die Zeichenfolge nur Ziffern enthält


323

Ich möchte überprüfen, ob a stringnur Ziffern enthält. Ich habe das benutzt:

var isANumber = isNaN(theValue) === false;

if (isANumber){
    ..
}

Aber erkannt, dass es auch erlaubt +und -. Grundsätzlich möchte ich sicherstellen, dass ein inputNUR Ziffern und keine anderen Zeichen enthält. Da +100und -5beide Zahlen sind, isNaN()ist nicht der richtige Weg zu gehen. Vielleicht brauche ich einen regulären Ausdruck? Irgendwelche Tipps?

Antworten:


641

wie wäre es mit

var isnum = /^\d+$/.test(val);

1
Das ist toll! Ich bin neugierig, bezieht sich \ d nicht auf eine Dezimalstelle?
Dewwwald

5
@dewwwald: Einige Sprachen implementieren es anders, aber in JavaScript \dist es genau gleichbedeutend mit [0-9].
Ry-

Hier finden Sie Dokumentation darüber, wie es Regular Expressionsfunktioniert
Danfoa

6
/^\d*$/stattdessen , wenn Sie eine leere Zeichenfolge finden, die nur Ziffern enthält .
6онстантин Ван

@DrorBar Es tut mir leid für mein schlechtes Englisch und ich möchte es umformulieren: "Wenn Sie eine leere Zeichenfolge als nur Ziffern betrachten ."
6онстантин Ван


16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false

2
In Javascript wird es als schlechte Praxis angesehen, Prototypen von eingebauten Objekten zu modifizieren (Prinzip der geringsten Überraschung und potenzielle Konflikte in zukünftigen ECMA-Versionen) - isNumber = () => /^\d+$/.test(this);stattdessen berücksichtigen und verwenden alsconsole.log(isNumber("123123));
Nick Bull

2
FWIW, als diese Antwort 2009 veröffentlicht wurde, wurde sie noch nicht als schlechte Praxis angesehen. Mehrere jQuery-Konkurrenten, die es damals gab, bevor sich jQuery noch durchsetzen musste, übten alle Prototypenerweiterungen.
Balupton

14

Wenn Sie sogar Gleitkommawerte (durch Punkte getrennte Werte) unterstützen möchten, können Sie diesen Ausdruck verwenden:

var isNumber = /^\d+\.\d+$/.test(value);

Wenn Sie jedoch kein float anstatt int verwenden, wird false zurückgegeben, möglicherweise mit "?" nachdem ". \" das gelöst hat. Ich schlage vor, dass /^\d+[\.,\, weibl? D+$/.test(value) sowohl Komma als auch Punktdezimalzahl zulässt (später kann Komma vielleicht in Punkt umgewandelt werden)
Lucke

@Lucke, der von Ihnen vorgeschlagene reguläre Ausdruck kann nur Zahlen mit einer Dezimalstelle oder höher als 9 finden. Wenn Sie die erste \d+in ändern \d*?, kann er mit 0 - 9 sowie mit Zahlen wie .333
Gust van

5
Schließen: var isNumber = /^\d*\.?\d+$/.test(value)- entspricht '3.5', '.5', '3' - stimmt nicht mit '3' überein.
Peter Hollingsworth

7

Hier ist eine weitere interessante, lesbare Methode, um zu überprüfen, ob eine Zeichenfolge nur Ziffern enthält.

Dieses Verfahren funktioniert durch Aufteilen der Zeichenfolge in eine Anordnung , die unter Verwendung von Spread - Operator , und verwendet dann die every()Methode zu testen , ob alle Elemente (Zeichen) in dem Array enthalten sind in der Ziffernfolge '0123456789':

const digits_only = string => [...string].every(c => '0123456789'.includes(c));

console.log(digits_only('123')); // true
console.log(digits_only('+123')); // false
console.log(digits_only('-123')); // false
console.log(digits_only('123.')); // false
console.log(digits_only('.123')); // false
console.log(digits_only('123.0')); // false
console.log(digits_only('0.123')); // false
console.log(digits_only('Hello, world!')); // false


1
Dies gibt auch truefür leere Zeichenfolgen ''und ein leeres Array [], ein Array von Ganzzahlen [1, 2, 3](sobald sie <10 sind) zurück. Es ist anfälliger für Fehler / Missbrauch als der grundlegende reguläre Ausdruck, den /^\d+$/ich denke
Drenai


5

Hier ist eine Lösung ohne reguläre Ausdrücke:

function onlyDigits(s) {
  for (let i = s.length - 1; i >= 0; i--) {
    const d = s.charCodeAt(i);
    if (d < 48 || d > 57) return false
  }
  return true
}

Dabei sind 48 und 57 die Zeichencodes für "0" bzw. "9".


4
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

Dies wird jedoch falsebei Zeichenfolgen mit führenden oder nachfolgenden Nullen zurückgegeben.


2

Nun, Sie können den folgenden regulären Ausdruck verwenden:

^\d+$

0

Wenn Sie auch Gleitkommawerte einschließen möchten, können Sie den folgenden Code verwenden

theValue=$('#balanceinput').val();
var isnum1 = /^\d*\.?\d+$/.test(theValue);
var isnum2 =  /^\d*\.?\d+$/.test(theValue.split("").reverse().join(""));
alert(isnum1+' '+isnum2);

Dies prüft nur auf Ziffern und Ziffern, die durch '.' getrennt sind. Der erste Test deckt Werte wie 0,1 und 0 ab, aber auch 0,1. Er lässt keine 0 zu. Die von mir vorgeschlagene Lösung besteht darin, den Wert umzukehren, sodass 0,1 1 ist. Dann lässt der gleiche reguläre Ausdruck dies nicht zu.

Beispiel:

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 

-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

Wenn eine Zeichenfolge nur Ziffern enthält, wird null zurückgegeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.