允许带有isNaN的小数

时间:2014-06-03 07:26:01

标签: javascript jquery html

我有一个脚本,我可以在一个文本框中放入一个数字,它将计算其他文本框中的等价物。

$("input[type=text]").keyup(function () {

        var number = parseFloat($(this).val());
        var inc = parseFloat($(this).attr("inc"));
        var newValue = number / inc;
        $("input[type=text]").each(function () {
              if(isNaN(newValue * parseFloat($(this).attr("inc"))))
                   $(this).val(0);
              else
                   $(this).val(newValue * parseFloat($(this).attr("inc")));
         });
});

可以查看:JSFiddle Here

目前它不允许使用十进制数字。但我真的需要它。我不知道如何允许小数。

此外,我需要盒子的小数点数限制为2位数。

1 个答案:

答案 0 :(得分:1)

TL; DR: 如果您只想修复,请跳至实际代码。以下段落解释了为什么会发生这种情况。

十进制数不起作用的原因是每次单个字符编辑文本框时,所有文本框中的所有数字都将转换为浮点数。如果您在其中一个框中键入1,则该值会传递到parseFloat并转换为1(相同的值)。如果您再按3字符,则文本框会显示13,该文本框会传递到parseFloat并返回相同的值13

但是,如果您开始输入13.,则会传递给parseFloat; JavaScript意识到句点是不必要的*,并将值13放在文本框中。无论你输入的速度有多快,JavaScript都会一直想要删除那个“不必要”的时期,然后再添加额外的数字。

您可以通过运行parseFloat函数(或以任何方式更改值)对您当前未输入的文本字段进行解决。我强调了两行哪个“魔术发生”:

$("input[type=text]").keyup(function () {
    var number = parseFloat($(this).val());
    var inc = parseFloat($(this).attr("inc"));
    var newValue = number / inc;
    var current = this;   // <---- "current" is the text field that is currently being edited
    $("input[type=text]").each(function () {
        if(this != current) {    // <--------------
            if (isNaN(newValue * parseFloat($(this).attr("inc"))))
                $(this).val(0);
            else
                $(this).val(newValue * parseFloat($(this).attr("inc")));
        }
    });
});

代码的JS小提琴,以便您可以测试它:http://jsfiddle.net/RX2sL/27/

* 技术上由于String -> Float -> String转换而缩短了期限,但更容易将期间视为“不必要”。