【问题标题】:How to ensure javascript addition instead of string concatenation (Not always adding integers)如何确保 javascript 添加而不是字符串连接(不总是添加整数)
【发布时间】:2012-10-19 20:39:41
【问题描述】:

通过我的 javascript 库,我得到了一个代表数字的字符串。现在我想对该数字进行加法运算,而不是进行字符串连接。解决方法很简单( 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) 如果你的号码总是整数。但是我的字符串可能是浮点数或整数,并且在添加时,我不知道它会是哪个。有没有办法确保无论是浮点数还是整数都发生加法?

【问题讨论】:

    标签: javascript string numbers addition


    【解决方案1】:

    尝试使用parseFloat。输入变量将被转换为浮点数,无论字符串包含整数还是浮点数都有效。您的结果将始终为浮点数。

    【讨论】:

    • 所以,我担心如果我使用 parseFloat() 最终会得到“5.0”而不是“5”,但显然情况并非如此?
    • parseFloat('5') == 5, parseFloat('5.11') == 5.11(至少在 Chrome 中)
    • 浮点数,所以它不会强迫你输入一定数量的数字。
    • 非常适合我;我正在从输入字段中读取值并执行一个复杂的函数,但是当 X == 1 时,函数中的所有地狱都崩溃了(a*x^2+bx+c with c=0 导致结果为十倍大,因为“0”被连接到末尾,而不是零值被添加到结果中)
    【解决方案2】:

    即使给定一个整数,始终使用parseFloat 也是相当安全的。如果您必须使用适当的转换,您可以match 作为小数点并使用适当的函数。

    【讨论】:

    • 我将您的想法纳入我的答案的较长版本中,这与您的想法相符吗?
    • 是的,我的意思是这样的:)
    【解决方案3】:

    我将假设浮动添加就足够了,如果不是,那么您需要更深入地挖掘。

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

    要接受@Asad 所说的,您可能想要这样做:

    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;
    }
    

    这将始终为您提供至少零输出,并且不会告诉您是否有任何一个是 NaN

    【讨论】:

    • 如果其中一个是 NaN 肯定会更好地返回 NaN 吗?
    • idk,规格是什么? ;-) ...你应该担心 NaN 因为它一有机会就会咬你。
    • 这里有个问题,就是true + 2返回3,而parseFlaot(true) + parseFloat(2)返回NaN。我的意思是,如果您不关心添加布尔值,那么这不是问题,但这就是我在这里的原因。
    • 我的第二个解决方案如何工作?似乎我的第二个解决方案基本上可以解决您担心的问题...
    • 没有按预期工作;当我期望 3 时,具有 2 和 true 的函数返回 2。我刚刚测试了 input === trueinput === false
    【解决方案4】:

    出于某种原因....谁知道???

    使用 parseFloat 有效....当 parseInt 无效时...显然它们并不总是相同的。

    FWIW....我在这里从“选中”复选框“添加”数据元素...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多