【问题标题】:Making a parseFloat only show one decimal使 parseFloat 只显示一位小数
【发布时间】:2018-09-13 09:58:11
【问题描述】:

我试图做到这一点,当用户输入一个数字时,如果他们碰巧输入了这个数字并且它有两个或多个小数,它会告诉他们这个数字是无效的,应该只有一个小数位并重述提示。

const MIN = 0;
const MAX = 7;
gradeInput = parseFloat( prompt('Enter Grade for ' + codeInput + '') );
while( isNaN( gradeInput ) || gradeInput<MIN || gradeInput>MAX ) 
{
	alert('Your input was invalid');
	gradeInput = parseFloat(prompt('Enter Grade for ' + codeInput + ''));
}

【问题讨论】:

    标签: javascript floating-point


    【解决方案1】:

    您可以使用a regular expression 来验证输入是否正确。您可以使用以下模式^\d+(?:\.\d)?$ (see it on Regex101)

    const regex = /^\d+(?:\.\d)?$/;
    
    const wrongInput = "12.3.4";
    const correctInput = "1.2";
    
    console.log("is wrongInput valid?", regex.test(wrongInput));
    console.log("is correctInput valid?", regex.test(correctInput));

    正则表达式检查输入是仅是数字还是数字,然后是一个点,然后是一个数字。

    因此,在您的情况下,您需要在解析之前检查提供的值的格式是否正确:

    const regex = /^\d+(?:\.\d)?$/;
    let codeInput = "algebra"
    let userGradeInput = prompt('Enter Grade for ' + codeInput + '');
    
    while (!regex.test(userGradeInput)) { //if there is no match
      alert('Your input was invalid');
      userGradeInput = prompt('Enter Grade for ' + codeInput + '');
    }
    
    gradeInput = parseFloat(userGradeInput);
    
    console.log(gradeInput)

    此代码不做其他测试只是为了说明如何使用正则表达式。要对输入执行所有检查,您可以拥有一个单独的函数,以便轻松重用它:

    function isValid(input) {
      const MIN = 0;
      const MAX = 7;
      const regex = /^\d+(?:\.\d)?$/;
      
      if (regex.test(input)) { //only do the other checks if the input looks correct
        const parsedInput = parseFloat(input);
        
        return parsedInput > MIN && parsedInput < MAX; //check if it's within bounds
      } else {//it doesn't even look like a number
        return false; 
      }
    }
    
    let codeInput = "algebra"
    gradeInput = prompt('Enter Grade for ' + codeInput + '');
    
    while(!isValid(gradeInput)) {
      alert('Your input was invalid');
      gradeInput = parseFloat(prompt('Enter Grade for ' + codeInput + ''));
    }
    
    console.log(gradeInput)

    最后一点 - 正则表达式 /^\d+(?:\.\d)?$/ 是一个相当简化的表达式。我怀疑这足以满足您的目的,但我认为值得解释一下。正则表达式不允许其他可能有效的输入,例如 -2+1.21.1e10 - 这些都可以正确解析为 JavaScript 数字格式,有些甚至可能是您的代码的有效数字,但将是被rejex拒绝。如需更全面的浮点数正则表达式,check the brilliant writeup on the Regular-Expressions.info website

    【讨论】:

    • 感谢您的帮助。我将它放入我的脚本中,但它仍然使一个数字有效,例如 1.11,而它不应该是。
    • 哦,对不起。我没有意识到您想要小数点后的单个数字。我已经修改了我的答案 - 你想要的正则表达式是 /^\d+(?:\.\d)?$/ 数字可选地后跟一个点和一个数字。
    • 成功了!非常感谢您的帮助,我真的很感激!
    【解决方案2】:

    您可以使用gradeInput.toPrecision(1) === gradeInput 来验证输入

    文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision

    【讨论】:

    • 这并没有真正“验证”输入。 充其量它会失败任何浮点数,当意图是它们被允许时。但是,它也会失败任何两位数,例如两个 - 例如对于gradeInput = 10,调用toPrecision(1) 将不等于基数。实际上,无论输入如何,所提出的建议都会失败每次,因为toPrecision 返回一个字符串而gradeInput 是一个数字,所以=== 将返回false,因为类型不匹配。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多