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


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.