web-dev-qa-db-ja.com

JavaScriptの小数点記号とは何ですか?

いくつかの浮動小数点値を処理するJavaScriptコードを書いていたときに、思いつきました。 JavaScriptの小数点記号とは何ですか?常に_._ですか?それとも文化固有ですか? .toFixed().parseFloat()はどうですか?ユーザー入力を処理している場合、ローカルカルチャ固有の小数点記号が含まれている可能性があります。

最終的には、ユーザー入力で小数点以下をサポートするコードを作成したいと思います-カルチャ固有と_._ですが、JavaScriptが期待するものがわからない場合、そのようなコードを書くことはできません。

追加:OK、ルーベンス・ファリアス 提案 を見る 類似の質問 これにはきちんとした受け入れられた答えがあります:

_function whatDecimalSeparator() {
    var n = 1.1;
    n = n.toLocaleString().substring(1, 2);
   return n;
}
_

いいですね、ロケールの小数点を取得できます。解決への一歩、間違いなく。

さて、残りの部分は.parseFloat()の振る舞いを決定することです。いくつかの答えは、浮動小数点リテラルでは_._のみが有効であると指摘しています。 .parseFloat()は同じように動作しますか?または、一部のブラウザでローカルの小数点記号が必要になる場合がありますか?浮動小数点数を解析するための別の方法もありますか?念のために自分でロールアウトする必要がありますか?

43
Vilx-

仕様によれば、DecimalLiteralは次のように定義されます。

_DecimalLiteral ::
    DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 
    . DecimalDigits ExponentPartopt 
    DecimalIntegerLiteral ExponentPartopt
_

そしてparseFloat引数を満たすために:

  1. InputStringをToString(string)とします。
  2. TrimmedStringを、StrWhiteSpaceCharではない左端の文字とその文字の右側にあるすべての文字で構成されるinputStringのサブストリングとします(つまり、先頭の空白を削除します)。
  3. TrimmedStringもtrimmedStringのプレフィックスもStrDecimalLiteral(9.3.1を参照)の構文を満たさない場合、NaNを返します。
  4. NumberStringをtrimmedStringの最も長いプレフィックスとします。trimmedString自体はStrDecimalLiteralの構文を満たします。
  5. MVの数値を返します

したがって、numberStringは、StrDecimalLiteralの構文を満たすTrimedStringの最長プレフィックスになります。これは、入力で見つかった最初の解析可能なリテラル文字列番号を意味します。 _._のみを使用して、浮動小数点数を指定できます。異なるロケールからの入力を受け入れる場合は、文字列の置換を使用します。

_function parseLocalNum(num) {
    return +(num.replace(",", "."));
}
_

この関数は、parseFloatの代わりに単項演算子を使用します。これは、入力について厳密にしたいように思われるためです。 parseFloat("1ABC")は_1_になりますが、単項演算子_+"1ABC"_を使用するとNaNが返されます。これにより、入力の検証が非常に簡単になります。 parseFloatの使用は、入力が正しい形式であると推測するだけです。

21
Andy E

使用する:

theNumber.toLocaleString();

適切な形式の文字列を取得するには

12
jspcal

私が知る限り、javascript自体は.小数点の区切り文字。 JSの事柄について私が信頼する判断を下す少なくとも1人の人:

http://www.merlyn.demon.co.uk/js-maths.htm#DTS

2
Matt Sach