Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront));

Код выше выводит что-то вроде:

base: 15000, upfront: 36, both: 1500036

Почему это соединение двух чисел, а не сложение их?

В конце концов я хочу установить значение другого поля на эту сумму, используя это:

mainPanel.feesPanel.initialLoanAmount.setValue(Ext.util.Format.number((base + upfront), '$0,000.00'));

И когда я пытаюсь это сделать, он превращает число в миллионы вместо 15 036,00. Почему?

16
Scott 3 Сен 2010 в 21:23

6 ответов

Лучший ответ

Это может произойти, потому что они строки. Попробуйте разобрать их:

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base) + parseInt(upfront))
);

Если эти числа десятичные, вам понадобится метод parseFloat.

15
Darin Dimitrov 3 Сен 2010 в 17:25

http://jsperf.com/number-vs-parseint-vs-plus/3

Это также может вас заинтересовать. Это просто сравнение производительности методов, уже упомянутых здесь.

1
tau 3 Сен 2010 в 17:30

Простой пример:

 1 +1 == 2
"1"+1 == "11"
"1"*1 + 1 == 2

Способы превратить строку в число:

  • parseInt(str)
  • parseInt(str,10)
  • parseFloat(str)
  • +str
  • str*1
  • str-0
  • str<<0
  • Number(str)

И вот некоторые из последствий: Результаты преобразования различных строк с использованием описанных выше методов
(источник: phrogz.net)

Number(str) ведет себя так же, как и str*1, но требует вызова функции.

Я лично использую *1, так как он короток для ввода, но все же выделяется (в отличие от унарного +), и либо дает мне то, что набрал пользователь, либо полностью терпит неудачу. Я использую parseInt() только тогда, когда я знаю , что в конце будет не числовое содержимое, которое нужно игнорировать, или когда мне нужно проанализировать строку не из base-10.

Вы можете проверить их производительность в своем браузере на странице моего примера.

27
Glorfindel 8 Авг 2019 в 05:20

Я не знаю, почему скобки не помогают вам.
Если я попробую

var base = 500;
var upfront = 100;
alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront))

Я получаю 600 в качестве ответа, так что может быть что-то происходит в функции Global.alert?

Одна из ошибок языкового дизайна заключается в том, что + является одновременно оператором сложения и оператором конкатенации. В сочетании с тем фактом, что он свободно напечатан и будет приведен неявно, это означает, что он может преподнести вам некоторые неприятные сюрпризы, если вы не предпримете шаги, чтобы убедиться, что вы действительно добавляете числа, а не объединяете строки. В этом случае он рассматривает ваш base + upfront как строки и, следовательно, объединяет.

В любом случае, вместо этого можно использовать (base - upfront*-1).

1
Phrogz 9 Фев 2011 в 19:10

Пытаться

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base,10) + parseInt(upfront,10))
);

10 определяет основание 10, в противном случае существует вероятность того, что значение будет проанализировано как восьмеричное.

6
davidj 3 Сен 2010 в 17:53

Он обрабатывает это как строку. Вы должны сделать свою математику перед строкой. Пример:

base + upfront + ' string' 

Вернул бы "15036 строка".

string + base + upfront

Вернет строку 1500036, как вы видите сейчас.

Или используйте parseInt ().

1
Peter Mortensen 13 Янв 2014 в 20:08