使用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); }
关键修改点
- 全局替换逗号:将
replace(",", "")改为replace(/,/g, ""),确保金额里的所有逗号都被移除。 - 优化复选框查找:直接使用
grid.rows[i].getElementsByTagName('input')[0]获取当前行的复选框,无需额外通过ID查找,提升代码效率。 - 简化数值计算:直接用
amountFC + amountVAT得到总和,避免重复从输入框读取数值再解析的冗余操作。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

