0

ユーザーが販売した最大30個のアイテムを追加し、金額を入力して価格を表示できるため、最大30個の異なるフィールドを計算するこのJavascript関数があります。このコードは各広告申込情報で機能します。最大30個の商品を追加して、個々の合計を問題なく確認できます。フォームの下部に小計領域があり、そこに表示されるこの$ NaNを振ることができません...コードを表示すると、小計、スタント、およびshowtot変数がNaNを取得しています...

$(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));

    });
});
4

5 に答える 5

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(例外的な状況を除く)。

于 2012-09-05T13:49:15.837 に答える
1

サンジェルビルの答えは見事に機能しました。これが将来の参考のための私の作業コードです...

$(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));

    });
}); 
于 2012-09-06T14:32:23.897 に答える
0

変化する

for (i = 0; i <= 30; i++) {

for (var i = 0; i <= 30; i++) {

于 2012-09-05T13:39:00.187 に答える
0

空の文字列とnull文字列をチェックする必要があるため、次のようにすべてのステートメントを変更します

var unitp = $("#unitp" + i).val();

var unitp = $("#unitp" + i).val()===''?0:$("#unitp" + i).val();

また

var unitp = $("#unitp" + i).val()||0;
于 2012-09-05T13:44:55.413 に答える
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になり、期待どおりに続行されます。

期待するintまたはfloatの値がわからないため、必要に応じて交換してください。

編集:あなたがそれらを呼び出す方法を知っているように、いくつかのparseIntを追加しました。

于 2012-09-05T13:45:19.153 に答える