2015-01-09 3 views
1

계속 Nan이 계속 발생하고 코드에 누락 된 부분이 있습니까? 내가 가지고있는 값은 순수 부동 소수점 숫자입니다 (예 : 79.00, 12.00 등). 이전에이 코드의 긴 버전을 작성했는데 올바른 대답을 얻었지만이 짧은 코드로 변경하면 코드의 NaN값은 부동 소수이지만 여전히 'NaN`

긴 버전 현재

function tblcheckboxes(){ 
    var a, b, c ... v = 0; 
    if ($('#tcbx1').is(":checked")) { 
     a = parseFloat($("#tcbx1").val(), 10); 
    } 
    if ($('#tcbx2').is(":checked")) { 
     b = parseFloat($("#tcbx2").val(), 10); 
    } 
    if ($('#tcbx3').is(":checked")) { 
     c = parseFloat($("#tcbx3").val(), 10); 
    } 
    ... 
    ... 
    ... 
    if ($('#tcbx23').is(":checked")) { 
     v = parseFloat($("#tcbx23").val(), 10); 
    } 
    var total = a + b + c ... + v; 
    $('.txt7').val(total.toFixed(2)); 
} 

$(document).ready(function(){ 
     $('#tcbx1').click(function(){ 
       tblcheckboxes(); 
     }); 
     $('#tcbx2').click(function(){ 
       tblcheckboxes(); 
     });   
     $('#tcbx3').click(function(){ 
       tblcheckboxes(); 
     }); 
     ... 
     ... 
     ... 
     $('#tcbx23').click(function(){ 
       tblcheckboxes(); 
     }); 
}); 

코드

function tblcheckboxes() { 
    var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v = 0; 
    var vars = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v]; // store in an array for easier access 

    var total = 0; // initialize total so it can be added while looping through the elements 

    for(var x = 1; x <= 23; x++) { 
     if($("#tcbx" + x).is(":checked")) { 
      vars[x - 1] = parseFloat($("#tcbx" + x).val(), 10); 
     } 
     total = parseFloat($(total).val(), 10) + vars[x - 1]; 
    } 

    $(".txt7").val(total.toFixed(2)); 
} 


$(document).ready(function() { 
    for(var i = 1; i <= 23; i++) { 
     $("#tcbx" + i).click(function() { 
      tblcheckboxes(); 
      grandtotal(); 
     }); 
    } 
}); 

$(":checkbox").on("change", function() { 
    //change input #grandtotal value according check/uncheck checkboxes 
    $(".txt7").val(function() { 
    //declare a variable to keep the sum of the values 
    var sum = 0; 
    //using an iterator find and sum the values of checked checkboxes 
    $(":checkbox:checked").each(function() { 
     sum = parseFloat($(sum).val(), 10) + parseFloat(~~$(this).val(), 10); 
    }); 
    return sum; 
    }); 
}); 

//here change the value according on checked checkboxes on DOM ready event 
$(".txt7").val(function() { 
    var sum = 0; 
    $(":checkbox:checked").each(function() { 
    sum = parseFloat($(sum).val(), 10) + parseFloat(~~$(this).val(), 10); 
    }); 
    return sum; 
}); 

jsFiddle

+3

당신은 당신의 HTML을 게시 할 수 있습니까? 또는 바이올린에서 다시 만드십시오? – jmore009

+2

'a','b','c'는'undefined'로 시작하고 모든 if 문이 실행되지 않으면 적어도 하나는'undefined'가됩니다. 'undefined '를 추가하면'NaN'이 생성됩니다. –

+0

@ AlexanderO'Mara의 의견을 확장하려면 각 var에 개별적으로 값을 할당해야합니다. 귀하의 예제에서'v == 0' –

답변

4
var a, b, c, ..., v = 0; 

은 모든 변수를 초기화하지 않습니다. v0으로 초기화하지만 다른 모든 변수는 정의되지 않습니다.

var a = 0, b = 0, c = 0, ..., v = 0; 

또는 당신은 할 수 있습니다 : 그것은 할 필요가

var a, b, c, ..., v; 
a = b = c = ... v = 0; 

난 당신이 모든에 대해 별도의 변수를 사용하여 재고 및 배열을 사용하는 것이 좋습니다. 그런 다음 모든 입력에 대해 반복하는 루프를 사용하고 해당 요소를 0 또는 입력 값으로 설정합니다.

+0

나는 변수를 개별적으로 선언하려고 시도했지만 여전히'NaN'을 얻는다. – Jennifer

+0

'parseFloat()'가'NaN'을 반환하는지 확인 했습니까? – Barmar

1

jQuery를 사용하는 경우 으로 사용하십시오. 당신이 쓸 때 때문에 당신은 모든 단일 VAR를 초기화해야

var total = 0; 

$('input[id^=tcbx]').each(function(cb){total += cb.checked? Number(cb.value) : 0}); 

console.log(total); 
+0

당신은 또한 선택기'input [id^= tcbx] : checked' – Barmar

1

: :이 tblcheckboxes 기능은 무엇인가 할 수있다 v 제외

var a, b, c ... v = 0; 

모든 변수가이 시점에서 null이, 그리고 이 작업을 수행 할 때

if ($('#tcbx1').is(":checked")) { 
    a = parseFloat($("#tcbx1").val(), 10); 
} 

$('#tcbx1').is(":checked")은 false 다음 a의 경우 정의되지 않은 때까지, 당신은이 작업을 수행 할 수 없습니다

var total = a + b + c ... + v; 

그래서 대신 이렇게 :

var a = 0, b = 0, c = 0 ... v = 0; 

편집 :parseFloat()는 두 개의 인수를하지만 여전히 작동하지 않습니다. 변경 사항을 고려하면 다른 것은 아마도 $("#tcbx1").val()에 숫자가 있지만 내부에 문자가있을 가능성이 높습니다.값이 순수 수 있는지 확인하거나 체크 박스 값이 편지를 포함 적어도 한 경우에는 값의 끝에 있어야합니다 : EDIT

parseFloat("12.3s", 10) // returns 12.3 
parseFloat("s12.3s", 10) // returns Nan 
parseFloat("12.3", 10) // returns 12.3 
parseFloat("12.3") // returns 12.3 

:가 jsFiddle 링크를 주셔서 감사합니다, 나는 이것을보고 :

if($("#tcbx" + x).is(":checked")) 

을 다시 vars[x - 1] 정의되지 않은,하지만 당신은 여전히 ​​캘리포니아에 노력하고있다 : 코드 안타 것을 는

for(var x = 1; x <= 23; x++) { 
    if($("#tcbx" + x).is(":checked")) { 
     vars[x - 1] = parseFloat($("#tcbx" + x).val(), 10); 
    } 
    total = parseFloat($(total).val(), 10) + vars[x - 1]; 
} 

확인 그걸로 + 연산자를 사용하면 작동하지 않을 것입니다. 당신이 뭘 하려는지 모르겠지만,이 있어야한다 쉬운 방법하지 않음 :이 보지 않는 이유

for(var x = 1; x <= 23; x++) { 
    if($("#tcbx" + x).is(":checked")) { 
     vars[x - 1] = parseFloat($("#tcbx" + x).val(), 10); 
     total += vars[x - 1]; 
    } 
} 

와는은 ... 음 : jsFiddle

+0

을 사용할 수 있습니다. 그러나 바르 마의 대답과 거의 15 분 후에 거의 일치합니다. – jmore009

+0

예, 그는'if'를 설명하는 것을 잊었습니다. 정황. 이유는 변수가 변수 위에'+'연산자를 호출 할 때 변수가 여전히 NaN 인 이유입니다. 물론 어떤 체크 박스가'checked'되지 않는다면 어떤 변수는'undefined'를 유지할 것입니다. –

+0

이미 해봤지만 여전히'NaN'을 얻었습니다 – Jennifer

관련 문제