剂量值未通过验证正确传递

时间:2016-05-16 14:51:02

标签: javascript validation

我正在编写一个函数来验证数字是否是有效剂量。有效剂量由0至100(包括范围)的值给出。它看起来很简单,但有三个条件:

  • 该值不是必需的,因此空值应返回true;
  • 可以存在一个可选的'%'百分号最后;
  • 小数位数也是可选的。

我认为我接近最后的功能,但有一个测试我的功能失败了,我不明白为什么:

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

感谢您的时间。

2 个答案:

答案 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测试。