我正在编写一个函数来验证数字是否是有效剂量。有效剂量由0至100(包括范围)的值给出。它看起来很简单,但有三个条件:
我认为我接近最后的功能,但有一个测试我的功能失败了,我不明白为什么:
function checkDosage(originalValue) {
var validDosage, isNumeric,
value = originalValue;
isNumeric = function(num) {
return !isNaN(num);
}
// take off percent sign if exists
if (value.slice(-1) == '%') {
value = value.slice(0, -1);
}
// get numeric value
value = parseFloat(value);
// check if it is really a number
isNumeric = isNumeric(value);
// conditional for dosage
validDosage = value >= 0 && value <= 100;
// treatment
if (!originalValue || isNumeric && validDosage) {
return true; // valid
}
return false; // invalid
}
checkDosage(''); // true
checkDosage('0'); // true
checkDosage('%'); // true
checkDosage('-1%'); // false
checkDosage('10.5%'); // true
checkDosage('10%%'); // true ??????? THIS SHOULD BE FALSE
checkDosage('100%'); // true
checkDosage('101%'); // false
感谢您的时间。
答案 0 :(得分:1)
问题是使用parseFloat
,它会丢弃它找到的任何尾随字符。
相反,请使用Number(string)
,它会返回一个数字或值NaN
(不是数字)。然后,您可以通过调用内置函数isNumeric
isNaN
函数
答案 1 :(得分:0)
您只是在检查字符串是否以%
结尾。您没有检查确切地存在零个或%
个。
在百分号逻辑中,您可以执行以下操作:
if (value.slice(-1) === '%') {
value = value.slice(0, -1);
if (value.slice(-1) === '%') {
return false;
}
}
这将切断百分号。如果字符串末尾仍有百分号,则表示有多个%
。因此,验证失败,返回false
。
编辑:您现有逻辑没有捕获双%
的原因是因为如果字符串是10%%
,并且您切断了最后%
,那么它将是10%
。如果您致电parseFloat('10%')
,您将返回10,通过isNumeric
测试。