使用 JavaScript 舍入表单中的用户输入

Rounding user input in form using JavaScript

我正在寻找一个正则表达式和一个 JavaScript 函数,将用户刚刚输入的内容四舍五入到最多 2 位小数,用户可以输入任何数字和点,例如1, 2.3490, 23 并且当用户点击远离该字段时它应该更改为 1.00, 2.35, 23.00。到目前为止我已经想到了这个:

这是我的正则表达式:

var pPrice = /^\d*\.\d*$/;

我的JavaScript函数:

// Function to validate price
   function validateProductPrice(){

    var priceRound = document.getElementById("productprice").value;
    var priceHack = Math.round(priceRound*100)/100;

    if (document.myForm.priceHack.value.trim().search(pPrice) == -1) {

        alert("WRONG INPUT FOR PRICE!");
        document.getElementById("priceERROR").style.display = "none";

    } else {
        document.getElementById("priceERROR").innerHTML = "CORRECT.";
        document.getElementById("priceERROR").style.display = "block";
      }
    }

我的 html 这个字段:

<div>    
<input type="text" class="productprice" placeholder="Price" name="productprice" onblur="return validateProductPrice() ">
<span id="priceERROR"></span>
  <p class="price-help">Price e.g. if  please enter 1.00.</p>
</div>

我遇到了一些麻烦,因为它实际上不起作用而且我不知道为什么!

感谢大家的帮助!

编辑

我通过修复我在以下答案中得到的正则表达式来修复它,并意识到我的输入没有 ID,所以我调用了一个空值,现在我的代码是:

我的正则表达式是:

var pPrice = /^((?:\d+(?:\.\d*)?)|(?:\.\d+))$/

我的 JavaScript 是:

function validateProductPrice(){

    var priceRound = document.getElementById("productprice").value;
    var priceHack = Math.round(priceRound*100)/100;

    if (document.myForm.productprice.value.trim().search(pPrice) == -1) {

        alert("WRONG INPUT FOR PRICE!");
        document.getElementById("priceERROR").style.display = "none";

    } else {

        document.getElementById("productprice").value = priceHack;
        document.getElementById("priceERROR").innerHTML = "CORRECT.";
        document.getElementById("priceERROR").style.display = "block";

    }

我的html是:

<div>    
<input id="productprice" type="text" class="productprice" placeholder="Price" name="productprice" onblur="return validateProductPrice()" >
<span id="priceERROR"></span>
  <p class="price-help">Price e.g. if  please enter 1.00.</p>
</div>  

现在它还会覆盖用户输入的任何内容,如果他输入 2.336678,则只显示 2.34,这就是我要找的!

谢谢大家帮我解决这个问题!希望我的编辑也能帮助人们!!

希望这就是您所需要的

var pPrice = /^\d*\.{0,1}\d*$/;

// Function to validate price
   function validateProductPrice(){

    var priceRound = document.getElementById("productprice").value;
    

    if (priceRound.trim().search(pPrice) == -1) {

        alert("WRONG INPUT FOR PRICE!");
        document.getElementById("priceERROR").style.display = "none";

    } else {  
      var priceHack = parseFloat(priceRound).toFixed(2);
       document.getElementById("productprice").value=priceHack;
        document.getElementById("priceERROR").innerHTML = "CORRECT.";
        document.getElementById("priceERROR").style.display = "block";
      }
    }
<div>    
<input type="text" class="productprice" placeholder="Price" name="productprice" id="productprice" onblur="return validateProductPrice() ">
<span id="priceERROR"></span>
  <p class="price-help">Price e.g. if  please enter 1.00.</p>
</div>

正则表达式

让我们从您的 RegEx 开始。你所拥有的将匹配具有任意小数位数的小数,但也可以匹配其他东西。

^((?:\d+(?:\.\d*)?)|(?:\.\d+))$

说明

首先我们声明,如果只有一个没有小数位的整数就可以了。但是,我们也允许 0.8 的简写形式 .8。然后我们匹配所有小数位并捕获数字。 Here 是对 RegEx 的测试。

JavaScript

我怀疑您想将更新后的值写入输入字段,但您从来没有这样做过。我更新了代码来做到这一点,并在每次用户输入内容时进行更新以提供更好的反馈。

var input = document.getElementById("price"),
    priceRegex = /^((?:\d+(?:\.\d*)?)|(?:\.\d+))$/,
    lastGood = "";

input.onkeyup = function(e) {
    if (input.value === ".") {
         lastGood = ".";
    }
    else if (priceRegex.test(price)) {
        var price = parseFloat(input.value);
        console.log("good");
        var newPrice = "" + (Math.round(price * 100) / 100) + (input.value.indexOf(".") === input.value.length -1 ? "." : "");
        input.value = newPrice;
        lastGood = newPrice;
    } else {
        console.log("bad");
        input.value = lastGood;
    }
}

说明

每次用户输入一个字符,上面的函数就会被调用。首先它检查用户是否刚刚输入了一个 .,这是一种特殊情况,因为它不是一个有效的数字,但可能是一个的开头。如果文本与上面解释的正则表达式匹配。如果是,则执行舍入并将其设置为新值。如果它与 RegEx 不匹配,则用户做错了,我们将输入字段重置为我们知道的最后一个正确值(最后一个与 RegEx 匹配的值)。

查看实际效果 here

希望以下内容对您有所帮助。

我使用 jQuery 进行模糊事件和设置值,但可以轻松地使用 JS 进行设置。

http://codepen.io/praveenvijayan/pen/doNKNz

 $('#txt').on('blur', function(){

    var val = $(this).val().split(','),
    tmp = [],
    res;
 val.map(function(val, i){
  if(typeof +val){
    res = Math.round(val * 100)/100
    tmp.push(res % 1 ? res : res + '.00');
  }
});

$(this).val(tmp.join(' ,'));

})