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?

Respuestas:


646

qué tal si

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

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 ".
Константин Ван


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

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

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


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

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.


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

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


2

Bueno, puedes usar la siguiente expresión regular:

^\d+$

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 

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.