我有这个Javascript函数可以计算多达30个不同的字段,因为用户可以添加最多30个他们销售的商品并输入金额并显示价格。此代码适用于每个订单项,我最多可以添加30个项目并查看其各自的总计。在表格的底部,我有一个小计区域,这是我无法动摇这个$ NaN出现的地方......当查看代码时,我的小计,stantot和showtot变量我得到了NaN ... < / p>
$(document).ready(function() {
var subtotal = 0;
var stantot = 0;
var showtot = 0;
$("input").keyup(function() {
for (i = 0; i <= 30; i++) {
var unitp = $("#unitp" + i).val();
var casep = $("#casep" + i).val();
var units = $("#units" + i).val();
var cases = $("#cases" + i).val();
var st_disc = $("#st_disc").val();
var sh_disc = $("#sh_disc").val();
var unitr = (unitp * units);
var caser = (casep * cases);
var result = (unitr + caser);
var st_disc_fix = (st_disc / 100);
var sh_disc_fix = (sh_disc / 100);
var st_disc_solo = (st_disc_fix * result);
var sh_disc_solo = (sh_disc_fix * result);
var disc_total = (st_disc_fix + sh_disc_fix);
var disc_whole = (disc_total * result);
var disc = (result - disc_whole);
var st_disc_tot = (result - disc_whole);
var sh_disc_tot = (result - disc_whole);
$("#line" + i).val('$' + result.toFixed(2));
$("#disc" + i).val('$' + disc.toFixed(2));
subtotal += parseInt(result);
stantot += parseInt(st_disc_tot);
showtot += parseInt(sh_disc_tot);
}
$("#totretail").val('$' + subtotal.toFixed(2));
$("#standiscount").val('$' + stantot.toFixed(2));
$("#showdiscount").val('$' + showtot.toFixed(2));
var totship = ($("#totship").val() * 1);
var tottax = ($("#tottax").val() * 1);
var finaltotal = (subtotal + stantot + showtot + totship + tottax);
$("#total").val('$' + finaltotal.toFixed(2));
});
});
答案 0 :(得分:1)
这就是我要做的事。
首先,我将创建一个带字符串的函数,并保证返回一个数字:
function toNumber(val) {
var num = parseFloat(val);
num = isNaN(num) ? 0 : num;
return num;
}
在这种情况下,任何NaN
值都将转换为零。您可以对其进行更改以满足您的应用需求。
然后,我会更新你的变量声明,你可以像这样输入字段值:
var unitp = toNumber($("#unitp" + i).val());
var casep = toNumber($("#casep" + i).val());
var units = toNumber($("#units" + i).val());
var cases = toNumber($("#cases" + i).val());
var st_disc = toNumber($("#st_disc").val());
var sh_disc = toNumber($("#sh_disc").val());
由于所有正在进行的计算均基于这些变量,如果您保证这些都不是NaN
,则以下任何值都不会是NaN
(禁止)特殊情况)。
答案 1 :(得分:1)
Saint Gerbil的回答很精彩,这是我未来参考的工作代码......
$(document).ready(function() {
var subtotal = 0;
var stantot = 0;
var showtot = 0;
$("input").keyup(function() {
for (var i = 0; i <= 30; i++) {
var unitp = parseFloat($("#unitp" + i).val()) || 0;
var casep = parseFloat($("#casep" + i).val()) || 0;
var units = parseFloat($("#units" + i).val()) || 0;
var cases = parseFloat($("#cases" + i).val()) || 0;
var st_disc = parseFloat($("#st_disc").val()) || 0;
var sh_disc = parseFloat($("#sh_disc").val()) || 0;
var unitr = (unitp * units);
var caser = (casep * cases);
var result = (unitr + caser);
var st_disc_fix = (st_disc / 100);
var sh_disc_fix = (sh_disc / 100);
var st_disc_solo = (st_disc_fix * result);
var sh_disc_solo = (sh_disc_fix * result);
var disc_total = (st_disc_fix + sh_disc_fix);
var disc_whole = (disc_total * result);
var disc = (result - disc_whole);
var st_disc_tot = (result - disc_whole);
var sh_disc_tot = (result - disc_whole);
$("#line" + i).val(result.toFixed(2));
$("#disc" + i).val(disc.toFixed(2));
subtotal += parseFloat((unitp * units) + (casep * cases));
stantot += parseFloat(st_disc_tot);
showtot += parseFloat(sh_disc_tot);
}
$("#totretail").val(subtotal.toFixed(2));
$("#standiscount").val(stantot.toFixed(2));
$("#showdiscount").val(showtot.toFixed(2));
var totship = ($("#totship").val() * 1);
var tottax = ($("#tottax").val() * 1);
var finaltotal = (subtotal + stantot + showtot + totship + tottax);
$("#total").val(finaltotal.toFixed(2));
});
});
答案 2 :(得分:0)
更改
for (i = 0; i <= 30; i++) {
到
for (var i = 0; i <= 30; i++) {
答案 3 :(得分:0)
你应该检查空字符串和空字符串 所以改变所有这样的陈述
var unitp = $("#unitp" + i).val();
到
var unitp = $("#unitp" + i).val()===''?0:$("#unitp" + i).val();
OR
var unitp = $("#unitp" + i).val()||0;
答案 4 :(得分:0)
将所有用户输入传递给parseFloat或parseInt(取决于您是否需要小数点)
$(document).ready(function() {
var subtotal = 0;
var stantot = 0;
var showtot = 0;
$("input").keyup(function() {
for (var i = 0; i <= 30; i++) {
var unitp = parseFloat($("#unitp" + i).val()) || 0;
var casep = parseFloat($("#casep" + i).val()) || 0;
var units = parseInt($("#units" + i).val(),10) || 0;
var cases = parseInt($("#cases" + i).val(),10) || 0;
var st_disc = parseFloat($("#st_disc").val()) || 0;
var sh_disc = parseFloat($("#sh_disc").val()) || 0;
var unitr = (unitp * units);
var caser = (casep * cases);
var result = (unitr + caser);
var st_disc_fix = (st_disc / 100);
var sh_disc_fix = (sh_disc / 100);
var st_disc_solo = (st_disc_fix * result);
var sh_disc_solo = (sh_disc_fix * result);
var disc_total = (st_disc_fix + sh_disc_fix);
var disc_whole = (disc_total * result);
var disc = (result - disc_whole);
var st_disc_tot = (result - disc_whole);
var sh_disc_tot = (result - disc_whole);
$("#line" + i).val('$' + result.toFixed(2));
$("#disc" + i).val('$' + disc.toFixed(2));
subtotal += parseInt(result);
stantot += parseInt(st_disc_tot);
showtot += parseInt(sh_disc_tot);
}
$("#totretail").val('$' + subtotal.toFixed(2));
$("#standiscount").val('$' + stantot.toFixed(2));
$("#showdiscount").val('$' + showtot.toFixed(2));
var totship = ($("#totship").val() * 1);
var tottax = ($("#tottax").val() * 1);
var finaltotal = (subtotal + stantot + showtot + totship + tottax);
$("#total").val('$' + finaltotal.toFixed(2));
});
});
这将默认NaN
个条目设为0,并且应该按预期继续。
不确定您期望的整数或浮点值是什么,因此根据需要进行交换。
编辑:添加了几个parseInt,以便您知道如何调用它们。