2016-04-03 38 views
3
不工作

我重构FizzBu​​zz使用功能和一切工作,除了在两个作用的if..else语句巨大意味着验证用户的输入(validateValue) 。我想提醒用户不允许空字符串,小数和NaN。检查小数的语句有效,但不是空字符串或NaN。当我输入一个空字符串或NaN时,会出现无小数的提示。我想使用香草JavaScript来解决这个问题,没有jQuery。if ... else语句来检查NaN和空字符串在JavaScript

这里是JavaScript:

function getValue(message) { 
    var msg = "Please enter a number from 1 to 100."; 
    if (message) { 
    msg = message; 
    } 
    return parseInt(prompt(msg)); 
} 

function validateValue(num) { 
    if (num === "") { 
    return getValue("Please type something."); 
    } else if (num%1 !== 0) { 
    return getValue("No decimals allowed."); 
    } else if (isNaN(num)) { 
    return getValue("That is not a number!"); 
    } else { 
    return num; 
    } 
} 

function fizzBuzz(num) { 
    for (var i = 1; i <= num; i++) { 
    if (i%15 === 0) { 
    document.getElementById("list").innerHTML += "FizzBuzz<br>"; 
    } 
    else if (i%3 === 0) { 
    document.getElementById("list").innerHTML += "Fizz<br>"; 
    } 
    else if (i%5 === 0) { 
    document.getElementById("list").innerHTML += "Buzz<br>"; 
    } 
    else { 
    document.getElementById("list").innerHTML += i + "<br>"; 
    } 
} 
} 

    var value = validateValue(getValue()); 
    fizzBuzz(value); 

下面是HTML:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" /> 
    <title>FizzBuzz Refactor</title> 
</head> 
<body> 
    <div> 
    <p>Your FizzBuzz results:</p> 
    <ul id="list"> 
    </ul> 
    </div> 
    <script type="text/javascript" src="app.js"></script> 
</body> 
</html> 
+3

嗯,首先,'的NaN%1'产量'NaN'和' NaN!== 0'是'true',所以'NaN%1!== 0'也是'true'。 –

+1

'num'已经通过'parseInt'处理的东西,所以它不可能是'“”' – Aprillion

+0

你从来没有得到一个空字符串validateValue'的'里面,因为你已经被称为'parseInt' – Bergi

回答

3

你可能想是这样的:

function validateValue(num) { 
    if (num === "") { 
    return getValue("Please type something."); 
    } 

    num = parseFloat(num); 

    if (isNaN(num)) { 
    return getValue("That is not a number!"); 
    } else if (num%1 !== 0) { 
    return getValue("No decimals allowed."); 
    } else { 
    return num; 
    } 
} 

字符串不能为NaN。所以你需要尝试将它转换为数字,然后再检查它是否为NaN。

+3

小数条件不会在事先使用'parseInt'的情况下 – charlietfl

+0

在这种情况下,您可以改用parseFloat。我已经更新了我的答案 – arnorhs

1

谢谢大家!这里是我的解决方案,注释掉:

function getValue(message) { 
    var msg = "Please enter a number from 1 to 100."; // default message 
    if (message) { 
    msg = message; 
    } 
    return prompt(msg); // return prompt with appropriate message based on value 
} 

function validateValue(num) { 
    if (num === "") { 
    return getValue("Please type something."); // check for empty string 
    } 

    num = parseFloat(num); // converts string to floating number 

    if (isNaN(num)) { 
    return getValue("That is not a number!"); // check for NaN 
    } else if (num%1 !== 0) { 
    return getValue("No decimals allowed."); // check for decimals 
    } else { 
    return num; 
    } 
} 
2

你可以尝试这样的事情:

function validate(str) { 
 
    if (validateEmpty(str)) { 
 
    console.log("Input is emply"); 
 
    } else if (validateNum(str)) { 
 
    console.log("Value is numeric"); 
 
    } else { 
 
    console.log("Invalid Input"); 
 
    } 
 
} 
 

 
function validateEmpty(str) { 
 
    return str === undefined || str == null || str.toString().trim().length === 0; 
 
} 
 

 
function validateNum(str) { 
 
    var reg = /[0-9]/i; 
 
    return reg.test(str); 
 
} 
 

 
(function() { 
 
    var a = ""; 
 
    validate(a); 
 
    a = "123.46"; 
 
    validate(a); 
 
    a = "123.46.57"; 
 
    validate(a); 
 
    a = "absl123.46.57"; 
 
    validate(a); 
 
    a = "test"; 
 
    validate(a); 
 
})()