25

Проверка десятичных чисел в JavaScript - IsNumeric()

15

Описание проблемы

Какой самый чистый и эффективный способ валидации десятичных чисел в JavaScript?

Дополнительные требования:

  1. Чистота: Решение должно быть простым и понятным.
  2. Кросс-платформенность: Решение должно работать на различных платформах.

Тестовые случаи:

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 ответ(ов)

0

Вам нужно определить функцию, проверяющую, является ли входное значение числом? Вот способ, который, похоже, работает хорошо:

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+         хотя бы одна цифра
$            конец строки

Удачи с вашим кодом!

0

Функция, которую вы предоставили, проверяет, является ли переданное значение числом, но она не делает это корректно. Ваша реализация возвращает true для всех чисел, включая NaN, так как NaN не удовлетворяет ни одному из условий.

Если вы хотите проверить, является ли значение числом (в том числе в шестнадцатеричном формате), я бы порекомендовал использовать функцию isFinite, чтобы удостовериться, что значение — это число и оно не NaN. Вот исправленный вариант:

function IsNumeric(num) {
    return typeof num === 'number' && isFinite(num);
}

Этот код будет правильно обрабатывать численные значения, включая числа в шестнадцатеричном формате, как 0x23, и будет возвращать false для NaN или других недопустимых числовых значений.

0

Используйте функцию isNaN. Я полагаю, что если вы проверите условие !isNaN(ваша_строка_здесь), это будет работать корректно для всех этих ситуаций.

0

Да, это можно сделать без использования регулярных выражений. Можно использовать следующую функцию:

function IsNumeric(data) {
    return parseFloat(data) == data;
}

Эта функция принимает данные в качестве аргумента и проверяет, является ли значение числом, сравнивая его с результатом parseFloat(). Если они равны, значит, значение числовое.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь