【问题标题】:Dosage values are not passing correct through validation剂量值未通过验证正确
【发布时间】:2016-05-16 14:51:01
【问题描述】:

我正在编写一个函数来验证一个数字是否是有效剂量。有效剂量由 0 到 100(包括范围)的值给出。看似简单,其实有3个条件:

  • 该值不是必需的,所以空值应该返回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

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript validation


    【解决方案1】:

    问题在于使用parseFloat,它会丢弃它找到的任何尾随字符。

    改为使用Number(string),它将返回一个数字或值NaN(不是数字)。然后你的isNumeric函数可以被调用内置函数isNaN替换

    【讨论】:

    • 一点也不。 parseFloat('10%'); /* 10 */Number('10%') /* NaN */
    【解决方案2】:

    您只是在检查字符串是否以% 结尾。您没有检查 %s 是否正好为零或一。

    在你的百分号逻辑中,你可以这样做:

    if (value.slice(-1) === '%') {
      value = value.slice(0, -1);
      if (value.slice(-1) === '%') {
        return false;
      }
    }
    

    这将去掉百分号。如果字符串末尾仍有百分号,则表示存在多个%。所以验证失败,返回false

    编辑:您现有的逻辑没有捕捉到双重% 的原因是因为如果字符串是10%%,并且您切断了最后一个%,那么它将是10%。如果你调用parseFloat('10%'),你会得到10,它通过了你的isNumeric测试。

    【讨论】:

    • 我想我明白了,但如果是('10p%')呢?
    • 或者你可以做while (value.slice(-1) === '%') { removeSign; }。然后一旦完成parseInt 结果以确保您有一个整数或在继续之前验证字符串是数字。这样,您可以确保在继续计算之前删除所有百分号。
    • 我认为它肯定会通过'10%%%',但用户也可以输入'10p%10',它会继续返回true,我认为真正的问题在于isNumeric测试你说,但我不知道具体是什么
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 2014-01-08
    • 1970-01-01
    • 2021-08-25
    • 2020-08-31
    • 1970-01-01
    • 2015-05-03
    • 2016-11-12
    相关资源
    最近更新 更多