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

325

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

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

if (isANumber){
    ..
}

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

patad
источник

Ответы:

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
balupton
источник
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 isANumber(str){
  return !/\D/.test(str);
}
Саранга Джаяруван
источник
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» соответственно.

SC1000
источник
5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

Хотя это вернет falseстроки с начальными или конечными нулями.

Питер Холлингсворт
источник
2

Ну, вы можете использовать следующее регулярное выражение:

^\d+$
детеныш
источник
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 
ануар эс-сайид
источник
-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

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

Лахани Алираза
источник