Функция IsNumeric не работает, если значение равно «0»

У меня есть эта функция JavaScript на моей странице Razor, чтобы проверить, является ли значение числовым.

Когда этой функции передается «0», она возвращает значение false. Я проверил это выражение в другом тестере RegEx, и «0» является допустимым совпадением. Если входной параметр равен «0,0», все в порядке.

Есть идеи, что пошло не так? Пожалуйста, порекомендуйте. Спасибо.

function isNumericValid(value) {
  var result = false;
  if (value != "") {
    // up to 12 digits and 10 dec places
    let template = /^-{0,1}\d{1,12}(\.\d{1,10})?$/;

    if (template.test(value))
      result = true;
  }
  return result;
}

console.info(isNumericValid("0"))
console.info(isNumericValid(0))
console.info(isNumericValid("0.0"))
console.info(isNumericValid(0.0))
console.info(isNumericValid(1234.10))

У меня работает (консоль DevTools): первый тестовый пример возвращает true. Если вы имеете в виду второй случай, передавая буквальный ноль, то это связано с тем, что условие длины не выполняется (это условие не является необходимым, поскольку регулярное выражение не соответствует пустой строке).

Richard 12.08.2024 09:45

Добро пожаловать в JavaScript. Вы можете рассматривать == и != не как «равные» и «неравные», а как «[не] подобные». И false, пустой массив, и число 0 похожи на пустую строку в своей «ничтожности» в разных типах, поэтому считаются подобными. Вот почему 0 != "" есть false. Самое простое решение — избавиться от проверки, поскольку ваше регулярное выражение все равно не соответствует пустой строке.

LWChris 12.08.2024 09:56

Пожалуйста, не используйте нерелевантные теги. Этот код не имеет ничего общего с ASP.NET Core или Razor Pages.

DavidG 12.08.2024 10:47

Есть ли причина не просто использовать функцию isNaN? Это будет распознавать другие числовые форматы, которые, возможно, нежелательны??

A Haworth 12.08.2024 10:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это потому, что value != "" возвращает false.

Замените не точными равными value !== "" или value != null или value.length > 0 (зависит от вашего варианта использования)

Действительно, это было так. Спасибо.

Ryan Ong 12.08.2024 10:03

value != "" возвращает false для 0 (но не для "0") из-за оператора !=, который выполняет приведение типов.

Добавьте toString и используйте !== не строго равно

function isNumericValid(value) {
  var result = false;
  value = value.toString().trim();
  if (value !== "") {
    // up to 12 digits and 10 dec places
    let template = /^-{0,1}\d{1,12}(\.\d{1,10})?$/;

    if (template.test(value))
      result = true;
  }
  return result;
}

console.info(isNumericValid("0"))
console.info(isNumericValid(0))
console.info(isNumericValid("0.0"))
console.info(isNumericValid(0.0))
console.info(isNumericValid(1234.10))

Виновник очевиден (входное значение должно быть строковым).

Вашу функцию можно свести к одной строке:

console.info(`isNumericValid("0"): ${isNumericValid("0")}`);
console.info(`isNumericValid(0): ${isNumericValid(0)}`);
console.info(`isNumericValid("0.0"): ${isNumericValid("0.0")}`);
console.info(`isNumericValid(0.0): ${isNumericValid(0.0)}`);
console.info(`isNumericValid(1234.10): ${isNumericValid(1234.10)}`);
console.info(`isNumericValid("-1234.10"): ${isNumericValid("-1234.10")}`);

function isNumericValid(value) {
  return /^-{0,1}\d{1,12}(\.\d{1,10})?$/.test(String(value).trim());
}

Другие вопросы по теме