Search code examples
javascriptc#angularjswcf-data-services

Angular js application functions failed to calculate total


I am trying to calculate grand total of the two column Money In and Money Out and account balance as well . I defined two function to calculate total but problem is its is displaying NAN at bottom of the web page instead of showing total .

Here is the Angular JS Code ..

@{
    Layout = null;
}

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.9/angular.min.js"></script>
    <script type="text/javascript">
        var app = angular.module('MyApp', [])
        app.controller('MyController', function ($scope, $http, $window) {
            $scope.IsVisible = false;
            $scope.Search = function () {
                var post = $http({
                    method: "GET",
                    url: "http://localhost:52098/HalifaxIISService.svc/TranscationDetails/" + encodeURIComponent($scope.Account_Number),
                    dataType: 'json',
                    headers: {
                        'Accept': 'application/json, text/javascript, */*; q=0.01',
                        'Content-Type': 'application/json; charset=utf-8'
                    }
                });

                post.then(function (response) { // .success(function(data => .then(function(response
                    var data = response.data; // extract data from resposne
                    $scope.Customers = JSON.parse(data); // eval(data.d) => JSON.parse(data)
                    $scope.IsVisible = true;
                }, function (err) {
                    $window.alert(err);
                });
            }

            $scope.grandTotal = function () {
                return $scope.Customers.reduce(function (previousTotal, m) {
                    return previousTotal + parseFloat(m.Deposit);
                }, 0); // Send in 0 as the default previousTotal
            }

            $scope.grandTotal1 = function () {
                return $scope.Customers.reduce(function (previousTotal, m) {
                    return previousTotal + parseFloat(m.Withdrawal);
                }, 0); // Send in 0 as the default previousTotal
            }
        });
    </script>
    @*<script type="text/javascript">
      var app = angular.module('MyApp', [])
      app.controller('MyController', function ($scope, $http, $window) {
          $scope.IsVisible = false;
          $scope.Search = function () {
              var post = $http({
                  method: "GET",
                  url: "http://localhost:52098/HalifaxIISService.svc/TranscationDetails/" + encodeURIComponent($scope.Account_Number),
                  dataType: 'json',
                  headers: {
                      'Accept': 'application/json, text/javascript, */*; q=0.01',
                      'Content-Type': 'application/json; charset=utf-8'
                  }
              });

              post.then(function (response) { // .success(function(data => .then(function(response
                  var data = response.data; // extract data from resposne
                  $scope.Customers = JSON.parse(data); // eval(data.d) => JSON.parse(data)
                  $scope.IsVisible = true;
              }, function (err) {
                  $window.alert(err);
                  });

              $scope.grandTotal = function () {
                  return $scope.Customers.reduce(function (previousTotal, m) {
                      return previousTotal + parseFloat(m.Deposit);
                  }, 0); // Send in 0 as the default previousTotal 
              }
              $scope.grandTotal1 = function () {
                  return $scope.Customers.reduce(function (previousTotal, m) {
                      return previousTotal + parseFloat(m.Withdrawal);
                  }, 0); // Send in 0 as the default previousTotal 
              }
          }
      });
    </script>*@
    <div ng-app="MyApp" ng-controller="MyController">
        Account Number:
        <input type="text" ng-model="Account_Number" />
        <input type="button" value="Submit" ng-click="Search()" />
        <hr />
        <table style="border: solid 2px Green; padding: 5px;" ng-show="IsVisible">
            @*<table cellpadding="0" cellspacing="0">*@
            <tr style="height: 30px; background-color: skyblue; color: maroon;">
                <th></th>
                <th> Account Number</th>
                 <th> Money In</th>
                <th>Date</th>
                 <th> Money Out</th>
                <th>Date</th>
                <th>Account Balance</th>

                <th></th>
                <th></th>

            </tr>
            <tbody ng-repeat="m in Customers">
                <tr style="height: 30px; background-color: skyblue; color: maroon;">
                    <td></td>
                    <td><span>{{m.Account_Number}}</span></td>
                     <td><span>{{m.Deposit| currency:"£"}}</span></td>
                    <td><span>{{m.Date}}</span></td>

                    <td><span>{{m.Withdrawal | currency:"£"}}</span></td>
                    <td><span>{{m.Date}}</span></td>
                    <td><span>{{m.Account_Balance| currency:"£"}}</span></td>

                </tr>


            </tbody>
            <table style="border: solid 2px Green; padding: 5px;" ng-show="IsVisible">
                <tr style="height: 30px; background-color: skyblue; color: maroon;">
                    <td>Total Money In:</td>

                    <td>{{grandTotal()}}</td>

                    <td>Total Money Out:</td>

                    <td>{{grandTotal1()}}</td>

                    <td>Account Balance:</td>

                    <td>{{m.Account_Balance| currency:"£"}}</td>

                </tr>
            </table>
        </table>

    </div>
</body>
</html>

Here is the Result when i run the application. enter image description here


Solution

  • My guess here is that you are getting NaN because you are adding at least 1 NaN value to your total. You are probably getting this NaN as you try to perform parseFloat() on an empty string. You have two options to prevent this: either check on the empty string first or check for NaN after the operation. Then only add non NaN values.

    For the total incoming money this gives the following code:

    $scope.grandTotal = function () {
        return $scope.Customers.reduce(function (previousTotal, m) {
            var valueToAdd = parseFloat(m.Deposit);
            if (isNaN(valueToAdd))
                return previousTotal;
            return previousTotal + valueToAdd;
        }, 0); // Send in 0 as the default previousTotal
    }