【问题标题】:How do I format a number to 2 decimal places, but only if there are already decimals?如何将数字格式化为 2 位小数,但前提是已经有小数位?
【发布时间】:2011-04-11 14:48:20
【问题描述】:

我有一个 jQuery 1.5+ 脚本,您在下拉菜单中选择一个数量(1、2、3 等),然后将该数量乘以 1.50 美元以显示总价。基本上 - 它将选择的数量(1、2、3 等)乘以 1.50 美元的基本价格 - 但是 - 我无法弄清楚如何用小数正确显示价格 - 例如:如果您选择的数量为 2,价格正确显示为 3 美元(无小数)。但是,如果您选择 1 或 3,价格将显示为 1.5 美元 / 4.5 美元 - 小数点后的百分之一缺少 0。

这是代码 - 知道在没有两位小数的情况下如何显示第二个 0 吗? 3 美元应该保持 3 美元,但 4.5 美元应该变成 4.50 美元,等等 - 如果不将所有数字显示为两位小数,我就无法让它工作,这就是我卡住的地方!

<script type='text/javascript'>     
    $(function() {         
        $('#myQuantity').change(function() {             
            var x = $(this).val();                      
            $('#myAmount').text('$'+(x*1.5));// this is the part that isn't displaying decimals correctly!
        });     
    }); 
</script>

我正在尝试类似 result = num.toFixed(2);但还不能让它工作。

谢谢!

【问题讨论】:

  • “toFixed(2)”在什么情况下不起作用?

标签: javascript jquery html decimal


【解决方案1】:

这应该可以完成工作:

var formattedNumber = (x * 1.5).toFixed(2).replace(/[.,]00$/, "");

【讨论】:

  • 完美运行!删除 *1,5 使其成为一个很好的可重用代码行
  • 为什么在 RegEx 中使用逗号?
  • @merlinpatt 小数点分隔符可能因地区而异
  • /[.,]0+$/ 似乎是一个更好的通用解决方案。
【解决方案2】:

我建议:

Math.round(floatNumber*100)/100;

它会自动添加 0、1 或 2 位小数。

【讨论】:

  • 最佳解决方案。我曾经使用“quantity % 1 === 0 ? quantity : quantity.toFixed(2)”,但你的更好
  • 这是我认为最好的答案
【解决方案3】:

工作示例:http://jsfiddle.net/peeter/JxPZH/

$(document).ready(function() {
    $('#itemQuantitySelect_3').change(function() {
        
        var itemPrice = 1.50;
        var itemQuantity = $(this).val();
        var quantityPrice = (itemPrice * itemQuantity);
        if(Math.round(quantityPrice) !== quantityPrice) {
            quantityPrice = quantityPrice.toFixed(2);
        }
        
        $(this).next("span").html("$" + quantityPrice);

    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/" method="post">
    <select id='itemQuantitySelect_3' name="itemQuantity_3">
        <option value='1'>1 Item</option>
        <option value='2'>2 Items</option>
        <option value='3'>3 Items</option>
    </select>
    <span>$1.50</span>
</form>

【讨论】:

  • 答案真的应该包含代码在答案中,而不仅仅是一个没有解释或评论的jsfiddle链接。
【解决方案4】:

怎么样

var str = num.toFixed(2).replace(/\.00$/, '');

【讨论】:

    【解决方案5】:

    如果数字%1 不返回零,则它不是整数。

    //var s='123';
    var s='1.2';
    
    s=Number(s);
    alert(s%1? s.toFixed(2): s);
    

    【讨论】:

    • 这里有一个问题,这个答案会与使用replace 的其他答案给出不同的结果。例如,如果s = 1.001,那么这会给你的结果1.00,而replace 方法会给你1。哪个更正确取决于您要做什么。
    【解决方案6】:

    使用此功能:

    //E.g. 0.5 becomes 0.50; 7 stays as 7.
    
    function twoDecimalPlacesIfCents(amount){
        return (amount % 1 !== 0) ? amount.toFixed(2) : amount;
    }
    

    【讨论】:

      【解决方案7】:
      const number = Number(Number(value).toFixed(t));
      

      有了这个,您可以将您的数字转换为正确的小数位数,并且在转换回数字时,去掉所有无用的零。

      【讨论】:

        【解决方案8】:
        value % 1 !== 0 ? value.toFixed(2) : value;
        

        【讨论】:

        • 在 StackOverflow 上添加解释为什么你的解决方案应该有效是一种很好的做法。
        • @Shree 这段代码的意思是 value % 1 !== 0 如果 value 的余数不等于 0 则显示 value.toFixed(2),否则只显示 value(不带小数)。跨度>
        【解决方案9】:

        如果你想要更通用的解决方案,基于odrmidea。

        function toFixed(value, fractionDigits) {
            return value.toFixed(fractionDigits).replace(/[.,](00)|0$/, '')
        }
        

        【讨论】:

          【解决方案10】:

          另一种可能性,将字符串强制转换为数字并利用 0.00 是错误的事实来确定它的显示方式:

          +(1.123456.toFixed(2)) || 0;
          >> 1.12
          

          在哪里:

          +(0.00123.toFixed(2)) || 0;
          >> 0
          

          【讨论】:

            【解决方案11】:

            实际上有一个更动态的解决方案来实现这一点。这很有用,尤其是当您的位数发生变化时。

            var formattedNumber = (x * 1.5).toFixed(2).replace(/\.0+$|(\.\d*[1-9])(0+)$/, "");
            

            这将结束:

            +(2.1234).toFixed(2).replace(/\.0+$|(\.\d*[1-9]);
            >> 2.12
            
            // but as mentioned it is dynamic
            +(2.1234).toFixed(3).replace(/\.0+$|(\.\d*[1-9]);
            >> 2.123
            
            +(2).toFixed(3).replace(/\.0+$|(\.\d*[1-9]);
            >> 2
            

            【讨论】:

            • 我喜欢这个想法,但由于正则表达式中的“.0”字符,代码无法正常工作。
            【解决方案12】:
              const getPercentage = (partialValue, totalValue) => {
                return ((100 * partialValue) / totalValue).toFixed(2).replace(/[.,]00$/, "");
              }; 
            

            你可以使用这个函数,然后在你想调用的地方调用它

            【讨论】:

              【解决方案13】:

              我建议:

              Intl.NumberFormat("en-US").format(<number>);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-04
                • 1970-01-01
                • 2011-09-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多