5

I have these HTML code that fetch data from database. I set an array to HTML input.

Html code

<table>
    <thead>
        <tr>
            <th>Category</th>
            <th>January</th>
            <th>February</th>
        </tr> 
    </thead>
    <tbody>
        <?php
        $sql = DB::getInstance()->FetchArray("select * from table");
        if(count($sql) > 0)
        {
            foreach($sql as $row)
            {
                $i = 0;
                if($i == 0)
                {?>
                    <tr>
                        <td><input type="text" class="cat1" id="cat1" name="cat1[]" value="<?php echo $row['CATEGORY']; ?>" placeholder="" readonly></td>
                        <td><input type="text" class="jan1" id="jan1" name="jan1[]" value="<?php echo (($row['MONTH']=='JANUARY')? $row['TOTAL']:''); ?>" placeholder="" readonly></td>
                        <td><input type="text" class="feb1" id="feb1" name="feb1[]" value="<?php echo (($row['MONTH']=='FEBRUARY')? $row['TOTAL']:''); ?>" placeholder="" readonly></td>
                    </tr> 
                <?php
                }
                else
                {?>
                    <tr>
                        <td></td>
                        <td><input type="text" class="jan1" id="jan1" name="jan1[]" value="<?php echo (($row['MONTH']=='JANUARY')? $row['TOTAL']:''); ?>" placeholder="" readonly></td>
                        <td><input type="text" class="feb1" id="feb1" name="feb1[]" value="<?php echo (($row['MONTH']=='FEBRUARY')? $row['TOTAL']:''); ?>" placeholder="" readonly></td>
                    </tr>
                <?php
                }
                $i++;
        }
        ?>
        <tr>
            <td colspan="2" style="text-align:right;">Total</td>
            <td><input type="text" class="form-control inputnumberwith2decimals total_jan1" id="total_jan1" name="" value="" placeholder="" readonly></td>
            <td><input type="text" class="form-control inputnumberwith2decimals total_feb1" id="total_feb1" name="" value="" placeholder="" readonly></td> 
        </tr>
    </tbody> 
</table>

The value for jan1[] display in console.log as

NaN
1000
3000
NaN

When i try to sum the total for jan1[], the output show as NaN because some of the array value is NaN. How can I set NaN value to 0 and do the sum calculation ?

What I want to achieve is to sum up the value like below

CATEGORY        JANUARY     FEBRUARY
BANANA          NaN         NaN
                1000        NaN
                2000        NaN
                NaN         NaN

TOTAL           3000        0

Here's the code for jQuery.

<script>
    $(document).ready(function(){
        var sum_jan1 = parseFloat(0);
        $(".jan1").each(function(){
            var value = parseFloat($(this).val());
            sum_jan1 += value;
        });
        $('#total_jan1').val(sum_jan1);
    });
</script>

Thanks.

benvc
  • 14,448
  • 4
  • 33
  • 54
Rzj Hayabusa
  • 657
  • 2
  • 11
  • 29
  • 1
    `NaN` is _falsy_ so you can use `var value = parseFloat($(this).val()) || 0;` – Phil Mar 12 '19 at 05:31
  • 1
    Possible duplicate of [How to turn NaN from parseInt into 0 for an empty string?](https://stackoverflow.com/questions/6736476/how-to-turn-nan-from-parseint-into-0-for-an-empty-string) – Phil Mar 12 '19 at 05:32

3 Answers3

4

You just need to convert the NaN values to 0 in your sum function. Following is an example using reduce:

const arr = [NaN, 1000, 3000, NaN];
const sum = arr.reduce((acc, num) => acc += num || 0, 0);
console.log(sum);
// 4000
benvc
  • 14,448
  • 4
  • 33
  • 54
3

Try this

<script>
$(document).ready(function(){
    var sum_jan1 = parseFloat(0);
    $(".jan1").each(function(){
        var value = parseFloat($(this).val());
        sum_jan1 += value?value:0;
    });
    $('#total_jan1').val(sum_jan1);
});

Deepak
  • 1,373
  • 2
  • 10
  • 31
2

just replace var value = parseFloat($(this).val()); to

var value = $(this).val() ? $(this).val() : 0; line.

This will solve your issue.

Mayur
  • 4,345
  • 3
  • 26
  • 40