Перевірте, чи містить рядок лише цифри


324

Я хочу перевірити, чи stringмістить він лише цифри. Я використав це:

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

if (isANumber){
    ..
}

Але зрозумів, що це також дозволяє +і -. В основному, я хочу переконатися, що inputмістить ТОЛЬКИ цифр і ніяких інших символів. Оскільки +100і -5обидва числа, isNaN()це не правильний шлях. Можливо, те, що мені потрібно? Якісь поради?

Відповіді:


644

як щодо

var 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));
Nick Bull

2
FWIW, у 2009 році, коли ця відповідь була опублікована, вона ще не вважалася поганою практикою. Кілька конкурентів jQuery, які існували тоді, перш ніж jQuery ще не виграв, усі практикували розширення прототипів.
balupton

14

Якщо ви хочете навіть підтримати значення з плаваючою величиною (значення, розділені крапкою), ви можете використовувати цей вираз:

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

однак, якщо ви не використовуєте float, а не int, він повернеться false, можливо, використовуючи "?" після ". \" вирішив це. Я пропоную це /^\d+ evidence\.,\,Sense?\d+$/.test(value), щоб дозволити як коми, так і крапкові точки (пізніше, можливо, можна перетворити кому на точку)
Lucke

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

5
Закрити: var isNumber = /^\d*\.?\d+$/.test(value)- відповідає '3,5', '.5', '3' - не відповідає '3.'
Пітер Холлінгсворт

7

Ось ще один цікавий, читабельний спосіб перевірити, чи містить рядок лише цифри.

Цей метод працює, розбиваючи рядок на масив, використовуючи оператор розповсюдження , а потім використовує 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+$/я думаю
Дренай


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" відповідно.


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. тож рішення, яке я пропоную, - перевернутиValue, так що .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.