You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用parseFloat计算ASP.NET GridView金额时超百万数值计算异常

ASP.NET GridView复选框金额计算异常修复

问题根源

原代码里替换金额逗号的逻辑有漏洞:replace(",", "")只能替换字符串里的第一个逗号。像1,001,870.00这种带多个逗号的金额,替换后会变成1001,870.00,parseFloat解析时碰到第二个逗号就会停止,只取前面的1,导致计算结果错误;而976,000只有一个逗号,替换后正常,所以计算没问题。

修复后的代码

把替换逗号的语句改成全局替换(用正则表达式/,/g匹配所有逗号),同时优化数值计算逻辑(没必要把计算好的数值写到输入框再读出来相加,直接用变量计算更高效):

function GetSelected() {
    debugger;
    
    var grid = document.getElementById("<%=grvGroup.ClientID%>");

    var amountFC = 0;
    var amountVAT = 0;
    var countSelect = 0;
    
    if (grid.rows.length > 0) {
        for (var i = 1; i < grid.rows.length; i++) {
            var checkBoxes = grid.rows[i].getElementsByTagName('input');
            var checkbox = checkBoxes[0]; // 直接取当前行的复选框,无需再通过ID查找

            if (checkbox.checked) {
                // 关键修改:用全局正则替换所有逗号
                var amtFC = grid.rows[i].cells[5].innerText.replace(/,/g, "");
                amountFC += parseFloat(amtFC);
                
                var amtVAT = grid.rows[i].cells[6].innerText.replace(/,/g, "");
                amountVAT += parseFloat(amtVAT);
                
                countSelect++;
            }
        }
        // 直接用计算好的变量赋值,减少DOM读写
        jQuery('#<%=txtTotalAmount.ClientID %>').val(amountFC);
        jQuery('#<%=txtTotalVat.ClientID %>').val(amountVAT);
        
        var totalSum = amountFC + amountVAT;
        jQuery('#<%=txtPayableAmount.ClientID %>').val(totalSum);
    }
    
    // 简化全选状态判断逻辑
    document.getElementById("ContentPlaceHolder1_checkallselect").checked = (grid.rows.length - 1 == countSelect);
}

关键修改点

  1. 全局替换逗号:将replace(",", "")改为replace(/,/g, ""),确保金额里的所有逗号都被移除。
  2. 优化复选框查找:直接使用grid.rows[i].getElementsByTagName('input')[0]获取当前行的复选框,无需额外通过ID查找,提升代码效率。
  3. 简化数值计算:直接用amountFC + amountVAT得到总和,避免重复从输入框读取数值再解析的冗余操作。

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:48:17