如何确保输入的值是一个数字而不是JavaScript中的字符串?

时间:2016-02-25 21:08:44

标签: javascript

我已创建此功能

function num(){
    var x = prompt("please enter your first number");
    var y = prompt("please enter your second number");

    if (isNaN(x)){
        num();}
    else if (isNaN(y)){
        num();}
    else if (x>y){console.log(x + " is greater than " + y);}
    else if (y>x){console.log(y + " is greater than " + x);}
    else {console.log("the two numbers are equal");}
}

该函数只会记录“两个数字相等”,因为它不能正常运行,当我取消isNaN函数正常运行时假设输入的值是数字

4 个答案:

答案 0 :(得分:0)

这样的事情应该是你需要的。希望能帮助到你。

var valid1 = false;
var valid2 = false;

var x = prompt("please enter your first number");
while (!valid1) {
if (isNaN(parseInt(x)))
{ x = prompt(x + " is not a number. Try Again.") }
else { valid1 = true; } }

var y = prompt("please enter your second number"); 
while (!valid2) {
if (isNaN(parseInt(y)))
{ y = prompt(y + " is not a number. Try Again.") } 
else{
valid2 = true;
if (x>y){
alert(x + " is greater than " + y); }
else if (y>x){alert(y + " is greater than " + x); }
else {alert("the two numbers are equal"); } } }

我添加了一个有效性循环来检查每个提示,因为我认为这是最终用户的良好做法。

我还修复了OP遇到问题的isNaN逻辑,并将parseInt添加到其中。

答案 1 :(得分:0)

试试这个。

//function to check if input is not number
function checkIfNaN(ipNo)
{
   if(ipNo && ipNo.trim()!='') //handle empty inputs
      return isNaN(Number(ipNo)); // Number will handle decimals as well. if parseInt is used 2.1 2.9 will be treated as equal
   else 
     return true;
 }

 function TestNumber()
 {
 var num1 , num2;

 while(checkIfNaN(num1)) //request user till number is entered
 {
         num1 = prompt("please enter your first number");
  }

  while(checkIfNaN(num2))
 {
         num2 = prompt("please enter your second number");
  }

  //Compare logic
 if(num1>num2) alert("1Big");
 else if(num1<num2) alert("2BIG");
 else alert("eq");
 }

 TestNumber();

<强>小提琴     https://jsfiddle.net/dk_dragonknight/p2wxjq8z/1/

答案 2 :(得分:0)

检测是否有任何类型的JS对象或文字表示数字有点棘手。这是因为大多数转换方法将伪值视为0,尤其是空字符串转换为零。

parseFloatparseInt是execptional,他们将从任何虚假值返回NaN。但是,它们将传递带有尾随非数字字符的字符串。因此,我们必须检测两者,假值和字符串。

唯一可靠的方法是CMS'es wiki-answer @KevinB中的方法已在评论中链接,即

if (!isNaN(parseFloat(n)) && isFinite(n)) {/* Passed, we've a number */}

然后是您的代码中的另一个问题,即输入无效值时的递归调用。如果您希望返回xy的总和,num将返回错误的值,如果在有效值之前输入了一些无效值。这个问题不会在您的特定代码中出现,但另一方面,它也不允许在正确的阶段将变量转换为数字,因此您无论如何都要更改代码

要解决递归问题,您需要单独检查每个prompt

var x, y;
while (!(!isNaN(parseFloat(x)) && isFinite(x))) {
    x = prompt(...);
}
while (!(!isNaN(parseFloat(y)) && isFinite(y))) {
    y = prompt(...);
}

现在xy代表有效数字,因此我们可以转换它们:

x = +x;
y = +y;

完成所有这些并seen it working之后,我们会看到,prompt实际上是一种向用户提供信息的糟糕方式。一种更好的方式是输入和&#34;获取关系&#34;按钮。

答案 3 :(得分:-3)

isNaN 函数在您尝试查看值是否为NaN时会产生很大的语义感。

window.prompt返回一个字符串,因此需要将其解析为整数。

var val = prompt("enter a number");
val = parseInt(val);

if (val === isNaN) {
    //do something if not a number
}
else {
    //do something else
}

您还可以使用正则表达式来测试输入字符串:

var val = prompt("enter a number");
var re = /^[0-9]+$/;

var found = val.match(re);

if (found) {//parenthesis not needed for typeof
    console.log('Is a num', found);//do something if it is a number
}
else {
    console.log('Is not a num', found);//do something else
}