繁体   English   中英

总计显示 NaN Javascript/Jquery

[英]Grand Total showing NaN Javascript/Jquery

我正在处理一个应用程序,在总计字段中,它显示了所有保证金字段总计的总和。 但是当页面加载它在总字段中显示 NaN 时。 如何显示现有总计以显示在总计字段中?

这是我的脚本。

演示

js

function getIndexedElement(item, index) {
     if (item.length) {
         if (index < item.length) {
             return item[index];
         } else {
             return false;
         }
     } else {
         if (index === 0) {
             return item;
         }
     }
     return false;
 }

 function isNum(value) {
     return 123;
 }

 function calcTotals() {
     var grandTotal = 0;
     var margin_total = 0;
     var total_inr1 = 0;
     var i = 0;

     while (getIndexedElement(document.forms['cart'].elements['add_percentage[]'], i)) {
         add_percentageObj = getIndexedElement(document.forms['cart'].elements['add_percentage[]'], i);
         addon_valueObj = getIndexedElement(document.forms['cart'].elements['addon_value[]'], i);
         total_inr_valueObj = getIndexedElement(document.forms['cart'].elements['total_inr[]'], i);

         totalObj = getIndexedElement(document.forms['cart'].elements['add_value[]'], i);
         priceunitObj = getIndexedElement(document.forms['cart'].elements['price_unit[]'], i);

         qtyObj = getIndexedElement(document.forms['cart'].elements['qty[]'], i);
         marginObj = getIndexedElement(document.forms['cart'].elements['margin_for[]'], i);


         if (isNaN(add_percentageObj.value)) {
             add_percentageObj = '';
         }
         if (isNaN(addon_valueObj.value)) {
             addon_valueObj = '';
         }

         if (add_percentageObj.value != 0) {
             totalObj.value = (((total_inr_valueObj.value * 1) * add_percentageObj.value / 100) + total_inr_valueObj.value * 1).toFixed(3);
             grandTotal = grandTotal + parseFloat(totalObj.value);
             marginObj.value = ((totalObj.value * 1) - (total_inr_valueObj.value * 1)).toFixed(3);

             margin_total = ((margin_total * 1) + marginObj.value * 1);
             //total_inr1 = total_inr1 + parseFloat(total_inr_valueObj.value);
             //c.value=Math.round((b.value/100) *a.value ).toFixed(2);

         } else if (addon_valueObj.value != 0) {
             totalObj.value = ((addon_valueObj.value * 1) + total_inr_valueObj.value * 1).toFixed(3);
             grandTotal = grandTotal + parseFloat(totalObj.value);
             marginObj.value = ((totalObj.value * 1) - (total_inr_valueObj.value * 1)).toFixed(3);

             margin_total = ((margin_total * 1) + marginObj.value * 1);
             //total_inr1 = total_inr1 + parseFloat(total_inr_valueObj.value);

         } else {
             totalObj.value = ((addon_valueObj.value * 1) + total_inr_valueObj.value * 1).toFixed(3);
             grandTotal = grandTotal + parseFloat(totalObj.value);
             marginObj.value = ((totalObj.value * 1) - (total_inr_valueObj.value * 1)).toFixed(3);

             margin_total = ((margin_total * 1) + marginObj.value * 1);
             //total_inr1 = total_inr1 + parseFloat(total_inr_valueObj.value);

         }

         i++;
     }

     //document.getElementById('grand_total').value = grandTotal.toFixed(3);
     //document.getElementById('margin_total').value = margin_total.toFixed(3);
     //document.getElementById('total_inr1').value = total_inr1.toFixed(3);
     //document.getElementById('margin_for').value = margin_for;

     marginTotal();

     return;
 }

 function marginTotal() {

     var x = $('[name="gt[]"]:checked').length;
     if (x != 0) return;
     var sum = 0;
     $('input[name="margin_for[]"]').each(function () {
         sum += +this.value;
     });
     $("#total12").val(sum);




 }
 $(function () {
     $("input[type='checkbox'").on("change", function () {
         recalcTotal();
     }).change();

     function recalcTotal() {
         var total12 = 0;
         var checkedinput = $("input:checked");
         var targetcheckboxes = checkedinput.length ? checkedinput : $("input:checkbox");
         targetcheckboxes.each(function () {
             total12 += parseFloat($(this).next("input").val(), 10) * 1;
         });

         $("#total12").val(total12.toFixed(3));

     }
 });

 $(window).load(function () {
     $(document).ready(function () {
         $("select").on('change', function () {

             var dept_number = $(this).val();
             var price = $(this).find(':selected').data('price');

             var selected = $(this).find('option:selected').text();

             if (selected == "INR") {
                 $(this).closest('table').find('.total1').val($(this).closest('table').find('.total').val());

             } else {

                 $(this).closest('table').find('.total1').val((($(this).closest('table').find('.total').val() * price) / $(this).closest('table').find('.inrvalue').val()).toFixed(3));
             }

             $(this).closest('table').find('.price_unit').val(($(this).closest('table').find('.total1').val() / $(this).closest('table').find('.qty').val()).toFixed(3));

         });
     });
 }); //]]>

在小提琴中,您可以看到最后一个字段,即边距字段。 极端下来,您可以看到总计。 页面加载其显示 NaN ..

更新的答案所以我错了,经过更多测试后,您的前 3 个readonly复选框没有value=0.000作为属性。

由于它们是text输入,javascript 不会自动假定空输入等于 0。

只需将value=0.000添加到前三个复选框


不正确的旧答案在你的targetcheckboxes.each()循环中,你的表达式: total12 += parseFloat($(this).next("input").val(), 10) * 1;

导致问题。

next("input")将匹配任何类型的输入,包括文本输入。 沿着你是连接字符串到您的线路某处total12变量,因此最终值total12不能被解析到一个浮动。

您只需要检查复选框旁边的输入值是否为 isNaN()
演示
有很多错误,例如,如果您在 Total colum 中输入 Text,您会在复选框旁边的文本框中以及 Grandtotal 中获得 NaN,因为您在输入更改后更新它,您需要在更改时验证文本框

         targetcheckboxes.each(function () {
             var temp=$(this).next("input").val();
             if(temp){
                total12 += parseFloat(temp, 10) * 1;
             }
         });
         $("#total12").val(total12.toFixed(3));

我认为你应该使用

parseInt(yourvalue);
parseFloat(yourvalue).toFixed(2);

每当您使用 js 计算某些东西时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM