6

このコードを試していますが、NaN を取得しています

a = unidade.val();
b = unitario.val();
//alert(a);5
//alert(b);50,00
$(total).val(a * b); //NaN

なんで?なぜint*floatですか?

4

3 に答える 3

14

valは常に文字列を返し、"50,00"自動的に数値に変換できないため、乗算する前に文字列を解析する必要があります。

parseFloat("50,1")を与えます50。ここのコンマが小数点記号の場合は、ドットに置き換える必要があります。

だからあなたはおそらく必要です

a = parseFloat(unidade.val().replace(",", ".");
b = parseFloat(unitario.val().replace(",", ".");

編集 :

のよう2.500,00にフォーマットされた数値を許可する場合は、次のコードを提案します。

function vf(str) {
   return parseFloat(str.replace(".", "").replace(",", "."));
}
a = vf(unidade.val());
b = vf(unitario.val());

しかし、アメリカ表記を好む (または期待する) ユーザーがいる場合は危険です。フィールドにコンマが含まれている場合は、おそらくアメリカの表記法に固執し、エラーを表示します。

HTML5 では<input type=number>、ユーザーに数値の入力を強制し、数値を直接取得できるようにする方法が提案されていることに注意してください。リファレンスを参照してください。

于 2012-12-05T17:45:15.090 に答える
3

関数から文字列を取得しているようですval()

Number、またはparseInt、またはを使用parseFloatして型をキャストできます

$(total).val(Number(a) * Number(b)); 
于 2012-12-05T17:48:26.123 に答える
1

乗算する前に文字列を解析する必要があります!

注: オペランドが数値の場合、通常の算術乗算が実行されます。つまり、2 つの正または 2 つの負は正に等しく、符号が異なるオペランドは負になります。結果が高すぎるか低すぎる場合、結果は Infinity または –Infinity になります。

いずれかのオペランドが NaN の場合、結果は NaN になります。

Infinity に 0 を掛けると、結果は NaN になります。

Infinity に 0 以外の数値を掛けると、2 番目のオペランドの符号に応じて、結果は Infinity または –Infinity になります。

Infinity に Infinity を掛けると、結果は Infinity になります。

于 2012-12-05T17:48:54.017 に答える