2

我正在尝试验证价格字段。我正在尝试这个:

var productId = document.getElementById("productId");
var productName = document.getElementById("productName");
var productPrice = document.getElementById("price");

alert(isFinite(productPrice.value));

if(isNaN(productPrice.value)||!isFinite(productPrice.value)){
    error = document.getElementById("priceError");
    error.innerHTML = "Please enter correct value";
    productPrice.style.border="thin solid red";
}else{
    error = document.getElementById("priceError");
    error.innerHTML = "";
}

当输入仅为空格/多个空格时,行警报给了我真的。这是我的 HTML 页面。

<td>Price</td>
<td><input type = "text" id = "price" size = "14"/></td>

谢谢

4

3 回答 3

3

为什么会发生这种情况我不能说,但是这段代码应该可以解决问题

isFinite(parseFloat(" ")) // false
// because -->
parseFloat(" "); // => result NaN
// tested in Chrome 27+ on Win7

在 isNaN 的 MDN 参考中,

isNaN(" ");     // false: a string with spaces is converted to 0 which is not NaN

更新:

在 isFinite 的参考中找到Here它指出 isFinite 仅在参数为时才返回 false:

  • NaN
  • 正无穷大, ( Number.POSITIVE_INFINITY)
  • 负无穷大 ( Number.NEGATIVE_INFINITY) 在任何其他情况下,它都返回 true。(就像 Paul S 提到的)

现在我想我得到了所有松散的结果,并且在那门课程中学到了一些东西。:)

于 2013-07-07T12:14:35.737 回答
1

window.isFinite,您必须意识到强制类型window.isNaN时遇到的问题。

window.IsNaN 摘要

确定一个值是否为 NaN。小心,这个功能坏了。你可能对 ECMAScript 6 Number.isNaN 感兴趣。

例子

isNaN(NaN);       // true 
isNaN(undefined); // true 
isNaN({});        // true

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);       // false

// strings 
isNaN("37");      // false: "37" is converted to the number 37 which is not NaN 
isNaN("37.37");   // false: "37.37" is converted to the number 37.37 which is not NaN
isNaN("");        // false: the empty string is converted to 0 which is not NaN 
isNaN(" ");  // false: a string with spaces is converted to 0 which is not NaN
// This is a false positive and the reason why isNaN is not entirely reliable

isNaN("blabla")   // true: "blabla" is converted to a number. Parsing this as a number fails and returns NaN

在 ECMAScript 6 中,有一些新方法Number.isNaN可以Number.isFinite解决这些问题。(当然这些在许多浏览器中都不可用

Number.isFinite相当于

function isFinite(number) {
    return typeof number === "number" && window.isFinite(number);
}

因此,作为一种解决方案,您需要考虑这样的事情(跨浏览器)。

注意:此解决方案仍允许您输入十六进制或科学记数法“0xA”、“1e10”

Javascript

function isFinite(number) {
    return typeof number === "number" && window.isFinite(number);
}

function trim(string) {
    return string.replace(/^\s+|\s+$/g, "");
}

var price = document.getElementById("price");

price.onchange = function (e) {
    var evt = e || window.event,
        target = evt.target || evt.srcElement,
        value = trim(target.value) || "NaN",
        number = +value;

    console.log("number:", number);
    console.log("isFinite:", isFinite(number));
}

jsfiddle 上

于 2013-07-07T13:29:05.540 回答
0

你可以使用正则表达式来做到这一点。

试试这个。

function validatePrice() {
    var el = document.getElementById('price');
    if ( 
         el.value.length < 14 && 
         /^ *\+?\d+ *$/.test( el.value )
       )
    {
        return true;
    }
    return false;
}

此函数检查输入是否为正整数。我不知道你是否也想要浮动值。如果这样做,请将正则表达式切换为此 /^ *+?\d+((.|,)\d+)? *$/

于 2013-07-07T12:15:25.480 回答