У меня есть эта функция 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))
Добро пожаловать в JavaScript. Вы можете рассматривать ==
и !=
не как «равные» и «неравные», а как «[не] подобные». И false
, пустой массив, и число 0 похожи на пустую строку в своей «ничтожности» в разных типах, поэтому считаются подобными. Вот почему 0 != ""
есть false
. Самое простое решение — избавиться от проверки, поскольку ваше регулярное выражение все равно не соответствует пустой строке.
Пожалуйста, не используйте нерелевантные теги. Этот код не имеет ничего общего с ASP.NET Core или Razor Pages.
Есть ли причина не просто использовать функцию isNaN? Это будет распознавать другие числовые форматы, которые, возможно, нежелательны??
Это потому, что value != ""
возвращает false.
Замените не точными равными value !== ""
или value != null
или value.length > 0
(зависит от вашего варианта использования)
Действительно, это было так. Спасибо.
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());
}
У меня работает (консоль DevTools): первый тестовый пример возвращает true. Если вы имеете в виду второй случай, передавая буквальный ноль, то это связано с тем, что условие длины не выполняется (это условие не является необходимым, поскольку регулярное выражение не соответствует пустой строке).