Compruebe si la cadena contiene solo dígitos

324

Quiero verificar si un stringcontiene solo dígitos. Usé esto:

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

if (isANumber){
    ..
}

Pero se dio cuenta de que también permite +y -. Básicamente, quiero asegurarme de que un solo inputcontenga dígitos y ningún otro carácter. Puesto que +100y -5son ambos números, isNaN()no es el camino correcto a seguir. Tal vez una expresión regular es lo que necesito? ¿Algun consejo?

patad
fuente

Respuestas:

646

qué tal si

let isnum = /^\d+$/.test(val);
Scott Evernden
fuente
1
¡Esto es genial! Tengo curiosidad, ¿no se refiere al dígito que es decimal?
dewwwald
55
@dewwwald: Algunos idiomas lo implementan de manera diferente, pero en JavaScript, \des exactamente equivalente a [0-9].
Ry-
Aquí puede encontrar documentación sobre cómo Regular Expressionsfunciona
Danfoa
66
/^\d*$/en cambio , si encuentra una cadena vacía que contiene solo dígitos .
Константин Ван
@DrorBar Lo siento por mi pobre inglés y permítanme reformularlo: "si consideras que una cadena vacía solo tiene dígitos ".
Константин Ван
65
string.match(/^[0-9]+$/) != null;
Jason S
fuente
16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false
Balupton
fuente
2
Se considera una mala práctica en Javascript para modificar prototipos de objetos integrados (principio de la menor sorpresa, y los conflictos potenciales en futuras versiones de ECMA) - considere isNumber = () => /^\d+$/.test(this);su lugar, y su uso comoconsole.log(isNumber("123123));
Nick Bull
2
FWIW, en 2009, cuando se publicó esta respuesta, todavía no se consideraba una mala práctica. Varios competidores de jQuery que existían entonces, antes de que jQuery aún no ganara, todos practicaban extensiones de prototipo.
balupton
14

Si desea incluso admitir valores flotantes (valores separados por puntos), puede usar esta expresión:

var isNumber = /^\d+\.\d+$/.test(value);
Adithya Sai
fuente
sin embargo, si no usa un float en lugar de int, devolverá falso tal vez usando "?" después de que ". \" resolvió eso. Sugiero esto /^\d+[\.,\,font>?\d+$/.test(value) para permitir tanto la coma como el punto decimal (más tarde tal vez pueda transformar la coma en un punto)
Lucke
@Lucke, la expresión regular que sugirió solo podrá encontrar números con un decimal o superior a 9. Si cambia el primero \d+a \d*?, podrá hacer coincidir 0 - 9, así como números como .333
Gust van de Wal
55
Cerrar: var isNumber = /^\d*\.?\d+$/.test(value)- coincide con '3.5', '.5', '3' - no coincide con '3.'
Peter Hollingsworth
7

Aquí hay otra forma interesante y legible de verificar si una cadena contiene solo dígitos.

Este método funciona dividiendo la cadena en una matriz usando el operador de propagación , y luego usa el every()método para probar si todos los elementos (caracteres) en la matriz están incluidos en la cadena de dígitos '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

Grant Miller
fuente
1
Esto también devolverá trueuna cadena vacía ''y una matriz vacía [], una matriz de enteros [1, 2, 3](una vez que son <10). Es más propenso a errores / mal uso que la expresión regular básica /^\d+$/, creo
Drenai
5

Esto es lo que quieres

function isANumber(str){
  return !/\D/.test(str);
}
Saranga Jayaruwan
fuente
5

Aquí hay una solución sin usar expresiones regulares:

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
}

donde 48 y 57 son los códigos char para "0" y "9", respectivamente.

SC1000
fuente
5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

Aunque esto volverá falseen cadenas con ceros iniciales o finales.

Peter Hollingsworth
fuente
2

Bueno, puedes usar la siguiente expresión regular:

^\d+$
Joey
fuente
1

si desea incluir valores flotantes también puede usar el siguiente código

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

esto probará solo dígitos y dígitos separados con '.' la primera prueba cubrirá valores como 0.1 y 0 pero también .1, no permitirá 0. entonces la solución que propongo es revertir el Valor para que .1 sea 1. entonces la misma expresión regular no lo permitirá.

ejemplo:

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 
anouar es-sayid
fuente
-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

Si una cadena contiene solo dígitos, devolverá nulo

Lakhani Aliraza
fuente