Проверка десятичных чисел в JavaScript - IsNumeric()
Описание проблемы
Какой самый чистый и эффективный способ валидации десятичных чисел в JavaScript?
Дополнительные требования:
- Чистота: Решение должно быть простым и понятным.
- Кросс-платформенность: Решение должно работать на различных платформах.
Тестовые случаи:
01. IsNumeric('-1') => true
02. IsNumeric('-1.5') => true
03. IsNumeric('0') => true
04. IsNumeric('0.42') => true
05. IsNumeric('.42') => true
06. IsNumeric('99,999') => false
07. IsNumeric('0x89f') => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3') => false
10. IsNumeric('') => false
11. IsNumeric('blah') => false
Помогите, пожалуйста, найти решение, которое соответствует указанным критериям!
4 ответ(ов)
Вам нужно определить функцию, проверяющую, является ли входное значение числом? Вот способ, который, похоже, работает хорошо:
function IsNumeric(input){
var RE = /^-{0,1}\d*\.{0,1}\d+$/;
return (RE.test(input));
}
Если хотите, можно сделать это в одну строку:
const IsNumeric = (num) => /^-{0,1}\d*\.{0,1}\d+$/.test(num);
Чтобы протестировать функцию, вы можете использовать следующий код:
const IsNumeric = (num) => /^-{0,1}\d*\.{0,1}\d+$/.test(num);
function TestIsNumeric(){
var results = ''
results += (IsNumeric('-1') ? "Pass" : "Fail") + ": IsNumeric('-1') => true\n";
results += (IsNumeric('-1.5') ? "Pass" : "Fail") + ": IsNumeric('-1.5') => true\n";
results += (IsNumeric('0') ? "Pass" : "Fail") + ": IsNumeric('0') => true\n";
results += (IsNumeric('0.42') ? "Pass" : "Fail") + ": IsNumeric('0.42') => true\n";
results += (IsNumeric('.42') ? "Pass" : "Fail") + ": IsNumeric('.42') => true\n";
results += (!IsNumeric('99,999') ? "Pass" : "Fail") + ": IsNumeric('99,999') => false\n";
results += (!IsNumeric('0x89f') ? "Pass" : "Fail") + ": IsNumeric('0x89f') => false\n";
results += (!IsNumeric('#abcdef') ? "Pass" : "Fail") + ": IsNumeric('#abcdef') => false\n";
results += (!IsNumeric('1.2.3') ? "Pass" : "Fail") + ": IsNumeric('1.2.3') => false\n";
results += (!IsNumeric('') ? "Pass" : "Fail") + ": IsNumeric('') => false\n";
results += (!IsNumeric('blah') ? "Pass" : "Fail") + ": IsNumeric('blah') => false\n";
return results;
}
console.log(TestIsNumeric());
Обратите внимание, что я позаимствовал этот регулярное выражение с сайта codetoad.com. Вот краткое объяснение:
^ начало строки
-{0,1} опциональный знак минус
\d* опциональные цифры
\.{0,1} опциональная десятичная точка
\d+ хотя бы одна цифра
$ конец строки
Удачи с вашим кодом!
Функция, которую вы предоставили, проверяет, является ли переданное значение числом, но она не делает это корректно. Ваша реализация возвращает true
для всех чисел, включая NaN
, так как NaN
не удовлетворяет ни одному из условий.
Если вы хотите проверить, является ли значение числом (в том числе в шестнадцатеричном формате), я бы порекомендовал использовать функцию isFinite
, чтобы удостовериться, что значение — это число и оно не NaN
. Вот исправленный вариант:
function IsNumeric(num) {
return typeof num === 'number' && isFinite(num);
}
Этот код будет правильно обрабатывать численные значения, включая числа в шестнадцатеричном формате, как 0x23
, и будет возвращать false
для NaN
или других недопустимых числовых значений.
Используйте функцию isNaN
. Я полагаю, что если вы проверите условие !isNaN(ваша_строка_здесь)
, это будет работать корректно для всех этих ситуаций.
Да, это можно сделать без использования регулярных выражений. Можно использовать следующую функцию:
function IsNumeric(data) {
return parseFloat(data) == data;
}
Эта функция принимает данные в качестве аргумента и проверяет, является ли значение числом, сравнивая его с результатом parseFloat()
. Если они равны, значит, значение числовое.
Как форматировать число с запятыми в качестве разделителей тысяч?
Как проверить, является ли строка действительным числом?
Как отсортировать массив целых чисел?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"