2010-09-03 5 views
13
Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront)); 

Код выше выдает что-то вроде:Добавление двух чисел в JavaScript неправильно

base: 15000, upfront: 36, both: 1500036 

Почему соединяющая два номера вместо добавления их?

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

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

И когда я пытаюсь что, получается число в миллионы вместо 15,036.00. Зачем?

ответ

10

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

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

Если эти цифры десятичного вам потребуется метод parseFloat вместо этого.

+5

-1 следует указать radix arg для parseInt – goat

1

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

base + upfront + ' string' 

вернет строку «15036».

string + base + upfront 

будет возвращать строку 1500036, как вы видите сейчас.

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

+0

Он использует скобки, поэтому добавление будет выполняться перед попыткой слиться с другой строкой (т. Е. Вам не нужно делать свою математику "до" строки, если вы используете скобки) , Но, parseInt будет работать - оператор ** + ** обрабатывает хотя бы один из своих операндов как строки. – palswim

6

Попробуйте

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

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

+0

Просто незначительный nit - в то время как вы правы, когда всегда указываете, что базой является хорошей идеей, база по умолчанию действительно 10, а не восьмеричная. Он принимает восьмеричные строки, начинающиеся с нуля (например, '' 0120 "'). –

+0

Так что, изменив значение «в противном случае это восьмеричное» на «иначе вероятность того, что значение будет разобрано как восьмеричное», будет хорошим редактированием? Это все о лучших методах, не так ли? – davidj

+0

+1 для указания радикса – goat

1

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

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

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

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

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

21

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

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)

А вот некоторые из последствий: Results of converting various strings using the above techniques http://phrogz.net/JS/string_to_number.png

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

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

Вы можете проверить эффективность их в своем браузере at my example page.

+0

+1, '+ s' и' s * 1' являются не только сокращенными, но и правильными. –

+0

+1 для пояснения на строке до номера – kjy112

+0

+1. Я добавлю, что 'Number()' также может дать вам странные результаты. Например, '+" "и' + "" 'приведет к' 0', где 'parseInt (" ", 10)' вернет 'NaN'. 'Number()' выравнивает пробел перед преобразованием, а пустая строка после обрезки всегда приводит к '0'. Как взлеты и падения с другими методами, желательно ли это поведение или нет, может варьироваться в зависимости от использования. Чаще всего я использую '+' (для меня это достаточно выделяется), но определенно стоит удостовериться, что вас не поймают то, что может показаться призраками в машине. –

Смежные вопросы