jalexyep
jalexyep

Reputation: 89

function sumDigits; How do I get this function to work with a negative number?

Question:

Write a function called sumDigits.

Given a number, sumDigits returns the sum of all its digits.

var output = sumDigits(1148);
console.log(output); // --> 14

If the number is negative, the first digit should count as negative.

var output = sumDigits(-316);
console.log(output); // --> 4

This is what I currently have coded and it works for positive values but I can't wrap my head around how to tackle the problem when given a negative value. When -316 is put into the function, NaN is returned and I understand that when I toString().split('') the number, this is what is returned: ['-', '3', '1', '6']. How do I deal with combining index 0 and 1?

function sumDigits(num) {
  var total = 0;
  var newString = num.toString().split('');
  for (var i = 0; i < newString.length; i ++) {
    var converted = parseInt(newString[i]);
    total += converted;
  }
  return total;
}

sumDigits(1148);

Any hints on what methods I should be using? and is there a smarter way to even look at this?

Upvotes: 0

Views: 2547

Answers (5)

Shawn Couch
Shawn Couch

Reputation: 1

function sumDigits(num) {
  let string = num.toString();
  let zero = 0;
  let total = 0;
  for (var i = 0; i < string.length; i++) {
    if (Math.sign(num) === 1) {
      total = zero += Number(string[i]);
    } else {
            for (var i = 2; i < string.length; i++) {
            total = (zero += Number(string[i])) - Number(string[1]);
      }
            }
  }
  return total;
}

Upvotes: 0

trincot
trincot

Reputation: 350365

One way to do this, is to do a split that will keep the minus and the first digit together, not split.

You can do that with a regular expression, and use match instead of split:

var newString = num.toString().match(/-?\d/g);

function sumDigits(num) {
  var total = 0;
  var newString = num.toString().match(/-?\d/g);
  for (var i = 0; i < newString.length; i++) {
    var converted = parseInt(newString[i]);
    total += converted;
  }
  return total;
}

var result = sumDigits(-316);
console.log(result);

In a bit shorter version, you could use map and reduce, like this:

function sumDigits(num) {
  return String(num).match(/-?\d/g).map(Number).reduce( (a, b) => a+b );
}

console.log(sumDigits(-316));

Upvotes: 1

le_m
le_m

Reputation: 20238

Is there a smarter way to even look at this?

You can avoid the conversion from number to string and back by using the modulo operator to extract the last digit. Repeat this step until you got all digits:

function sumDigits(num) {
  let total = 0, digit = 0;
  while (num != 0) {
    total += digit = num % 10;
    num = (num - digit) * 0.1;
  }
  return total < 0 ? digit + digit - total : total;
}

console.log(sumDigits(-316));                    // 4
console.log(sumDigits(1148));                    // 14
console.log(sumDigits(Number.MAX_SAFE_INTEGER)); // 76

Upvotes: 0

gyre
gyre

Reputation: 16787

You could always use String#replace with a function as a parameter:

function sumDigits (n) {
  var total = 0
  n.toFixed().replace(/-?\d/g, function (d) {
    total += +d
  })
  return total
}

console.log(sumDigits(-1148)) //=> 14

Upvotes: 1

OctoCode
OctoCode

Reputation: 390

This should do it:

    function sumDigits(num) {
      var total = 0;
      var newString = num.toString().split('');
      for (var i = 0; i < newString.length; i ++) {
        if(newString[i]==='-') { //check to see if the first char is -
          i++; //if it is, lets move to the negative number
          var converted =  parseInt(newString[i]); // parse negative number
          total -= converted; // subtract value from total
          continue; // move to the next item in the loop
        }
        var converted = parseInt(newString[i]);
        total += converted;
      }
      return total;
    }

console.log(sumDigits(-316));

Upvotes: 1

Related Questions