5

Through my javascript library, I end up with a string that represents a number. Now I want to preform an addition on that number without it doing a string concatenation instead. The solution is easy ( How do I add an integer value with javascript (jquery) to a value that's returning a string?, How to make an addition instead of a concatenation) if your number is always in integer. However my string could be a float or an integer, and at the time of the addition, and I don't know which it will be. Is there a way to make sure the addition happens regardless of whether it's a float or integer?

4 Answers 4

10

Try using parseFloat. The input variables will be converted to floats, which will work whether the string contains an integer or a float. Your result will always be a float.

Sign up to request clarification or add additional context in comments.

4 Comments

So, I was worried that if I used parseFloat() I'd end up with "5.0" instead of "5", but apparently that's not the case?
parseFloat('5') == 5, parseFloat('5.11') == 5.11 (in Chrome at least)
Floating point, so it won't force a certain number of digits down your throat.
Worked perfectly for me; I was reading values from an input field and performing a complex function, but when X was == 1, then all hell broke loose in the function (a*x^2+bx+c with c=0 was causing the result to be ten times to large, as "0" was being concatenated to the end, rather than the value of zero being added to the result)
4

It is reasonably safe to always use parseFloat even if you are given an integer. If you must use the appropriate conversion, you could match for a decimal point and use the appropriate function.

2 Comments

I incorporated your thought into a longer version of my answer, does that sort of match up with what you thought?
Yup, something like that is what I meant :)
2

I'm going to assume that float addition is sufficient, and if it isn't, then you'll need to dig deeper.

function alwaysAddAsNumbers(numberOne, numberTwo){
  var parseOne = parseFloat(numberOne),
      parseTwo = parseFloat(numberTwo);
  if (isNaN(parseOne)) parseOne = 0;
  if (isNaN(parseTwo)) parseTwo = 0;
  return parseOne + parseTwo;
}

To take what @Asad said, you might want to do this instead:

function alwaysAddAsNumbers(a, b){
  var m = 0,
      n = 0,
      d = /\./,
      f = parseFloat,
      i = parseInt,
      t = isNaN,
      r = 10;
  m = (d.test(a)) ? f(a) : i(a,r);
  n = (d.test(b)) ? f(b) : i(b,r);
  if (t(m)) m = 0;
  if (t(n)) n = 0;
  return m + n;
}

this will always give you at least a zero output, and doesn't tell you if either one is NaN.

11 Comments

Surely better to return NaN if either is NaN ?
idk, what's the spec? ;-) ... You should be concerned with NaN cos it'll bite you in the arse first chance it gets.
There's a problem with this, which is that true + 2 returns 3, but parseFlaot(true) + parseFloat(2) returns NaN. I mean if you don't care about adding bools then it isn't a problem but that's why I'm here.
How does that work with my second solution? Seems like my second solution does basically what you're worried about ...
Doesn't quite work as expected; that function with 2 and true returns 2 when I'd expect 3. I just ended up testing for input === true or input === false.
|
0

For some reason.... who knows???

Using parseFloat works.... when parseInt does not... obviously they are not always the same.

FWIW.... I'm "adding" data elements from "checked" checkboxes here...

    var AddOns = 0;

    $( '.broadcast-channels').each(function(){              
        if ( $(this).prop("checked")) {                             
            var thisAddOn =  parseFloat($(this).data('channel'));      
            AddOns = AddOns + thisAddOn;                                      
        }           
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.