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


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.