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
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.
4 Comments
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)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'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
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.input === true or input === false.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;
}
});