Проверьте, содержит ли строка только цифры


325

Я хочу проверить, stringсодержит ли только цифры. Я использовал это:

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

if (isANumber){
    ..
}

Но понял, что это также позволяет +и -. По сути, я хочу убедиться, что он inputсодержит ТОЛЬКО цифры и никаких других символов. Так как +100и -5оба числа, isNaN()это не правильный путь. Может быть, мне нужно регулярное выражение? Какие-нибудь советы?

Ответы:


647

как насчет

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

1
Это круто! Мне любопытно, не относится ли к десятичной цифре?
dewwwald

5
@dewwwald: Некоторые языки реализуют это по-разному, но в JavaScript \dэто точно эквивалентно [0-9].
Ry-

Здесь вы можете найти документацию о том, как Regular Expressionsработают
Danfoa

6
/^\d*$/вместо этого , если вы найдете пустую строку, содержащую только цифры .
Константин Ван

@DrorBar Я извиняюсь за мой плохой английский и позвольте мне перефразировать его: «если вы считаете, что пустая строка имеет только цифры ».
Константин Ван


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

2
В Javascript считается плохой практикой модифицировать прототипы встроенных объектов (принцип наименьшего удивления и потенциальные конфликты в будущих версиях ECMA) - рассмотрите isNumber = () => /^\d+$/.test(this);вместо этого и используйте какconsole.log(isNumber("123123));
Ник Булл

2
FWIW, в 2009 году, когда этот ответ был опубликован, он еще не считался плохой практикой. Несколько конкурентов jQuery, которые существовали тогда, до того, как jQuery еще не победил, все практиковали расширения прототипов.
Балуптон

14

Если вы хотите даже поддерживать значения с плавающей точкой (значения, разделенные точками), вы можете использовать это выражение:

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

однако если вы не используете float, вместо int он вернет false, возможно, используя "?" после ". \" решил это. Я предлагаю это /^\ d+[\.,\,]?\d+$/.test(value), чтобы разрешить запятую и десятичную точку (позже, возможно, может преобразовать запятую в точку)
Лак

@Lucke, предложенное вами регулярное выражение сможет найти только числа с десятичным или большим числом 9. Если вы измените первое \d+на \d*?, оно сможет соответствовать 0 - 9, а также таким числам, как .333
Gust van де Валь

5
Закрыть: var isNumber = /^\d*\.?\d+$/.test(value)- соответствует «3,5», «.5», «3» - не соответствует «3».
Питер Холлингсворт,

8

Вот еще один интересный, читаемый способ проверить, содержит ли строка только цифры.

Этот метод работает, разбивая строку на массив с помощью оператора распространения , а затем использует every()метод для проверки, все ли элементы (символы) в массиве включены в строку цифр '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
Это также вернет trueпустую строку ''и пустой массив [], массив целых чисел [1, 2, 3](если они <10). /^\d+$/Я думаю, что он более подвержен ошибкам / неправильному использованию, чем основное регулярное выражение
Drenai


5

Вот решение без использования регулярных выражений:

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
}

где 48 и 57 - коды символов для «0» и «9» соответственно.




1

если вы хотите включить значения с плавающей точкой, вы можете использовать следующий код

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

это будет проверять только цифры и цифры, разделенные '.' первый тест будет охватывать значения, такие как 0,1 и 0, но также .1, он не допустит 0. поэтому решение, которое я предлагаю, состоит в том, чтобы перевернуть значение, так что .1 будет 1. тогда то же самое регулярное выражение не допустит этого.

пример :

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.