Verifique se a string contém apenas dígitos


324

Quero verificar se a stringcontém apenas dígitos. Eu usei isso:

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

if (isANumber){
    ..
}

Mas percebi que também permite +e -. Basicamente, quero ter certeza de que um inputcontém APENAS dígitos e nenhum outro caractere. Desde +100e -5são os dois números, isNaN()não é o caminho certo a seguir. Talvez uma regexp seja o que eu preciso? Alguma dica?

Respostas:


645

e quanto a

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

1
Isso é ótimo! Estou curioso, não se refere ao dígito decimal?
dewwwald

5
@dewwwald: Algumas línguas o implementam de maneira diferente, mas em JavaScript, \dé exatamente equivalente a [0-9].
Ry-

Aqui você pode encontrar documentação sobre como Regular Expressionso trabalho
Danfoa

6
/^\d*$/em vez disso , se você encontrar uma sequência vazia contendo apenas dígitos .
Константин Ван

@DrorBar Me desculpe pelo meu inglês ruim e deixe-me reformulá-lo: “se você considera uma string vazia com apenas dígitos .”
Константин Ван


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

2
É considerado uma má prática em Javascript para modificar protótipos de objetos internos (princípio da menor surpresa, e potenciais conflitos em futuras versões ECMA) - considerar isNumber = () => /^\d+$/.test(this);vez, e uso comoconsole.log(isNumber("123123));
Nick Touro

2
FWIW, em 2009, quando esta resposta foi publicada, ainda não era considerada uma má prática. Vários concorrentes do jQuery que existiam na época, antes que o jQuery ainda não vencesse, todos praticavam extensões de protótipo.
balupton

14

Se você deseja mesmo suportar valores flutuantes (valores separados por pontos), use esta expressão:

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

no entanto, se você não usar um float, o int retornará false, talvez usando "?" depois que ". \" resolveu isso. Eu sugiro este /^\d+[\.,\,]?\d+$/.test(value) para permitir que tanto vírgula e ponto decimal (mais tarde talvez pode transformar vírgula para ponto)
Lucke

@Lucke, o regex que você sugeriu só poderá encontrar números com um decimal ou mais que 9. Se você alterar o primeiro \d+para \d*?, ele poderá corresponder de 0 a 9, além de números como .333
Gust van de Wal

5
Fechar: var isNumber = /^\d*\.?\d+$/.test(value)- corresponde a '3,5', '.5', '3' - não corresponde a '3'
22818 Peter Hollingsworth

7

Aqui está outra maneira interessante e legível de verificar se uma string contém apenas dígitos.

Esse método funciona dividindo a sequência em uma matriz usando o operador de dispersão e, em seguida, usa o every()método para testar se todos os elementos (caracteres) na matriz estão incluídos na sequência 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
Isso também retornará truepara uma string vazia ''e uma matriz vazia [], uma matriz de números inteiros [1, 2, 3](quando forem <10). É mais propenso a erros / abuso do que a expressão regular básica /^\d+$/Eu acho
Drenai


5

Aqui está uma solução sem usar expressões 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
}

onde 48 e 57 são os códigos de caracteres para "0" e "9", respectivamente.


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

Embora isso retorne falseem strings com zeros à esquerda ou à direita.


2

Bem, você pode usar o seguinte regex:

^\d+$

1

Se você deseja incluir valores flutuantes, também pode usar o seguinte código

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

isso testará apenas dígitos e dígitos separados por '.' o primeiro teste cobrirá valores como 0,1 e 0, mas também 0,1, ele não permitirá 0. Portanto, a solução que proponho é reverter o Valor para que 0,1 seja 1. então a mesma expressão regular não permitirá.

exemplo:

 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

Se uma string contiver apenas dígitos, ela retornará nulo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.