49

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

最終的には、ユーザー入力の両方の小数点(カルチャ固有と)をサポートするコードを記述したいのですが.、JavaScriptが何を期待するかわからない場合、そのようなコードを記述できません。

追加: OK、ルーベンス・ファリアスは、きちんと受け入れられた答えを持っている同様の質問を見ることを提案します:

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

それは素晴らしいです、それは私がロケールの小数点を取得することを可能にします。間違いなく、解決に向けた一歩。

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

4

3 に答える 3

23

仕様によれば、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の最長のプレフィックスとします。これは、StrDecimalLiteralの構文を満たす、trimmedString自体である可能性があります。
  5. MVの数値を返します

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

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

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

于 2010-01-18T10:38:00.067 に答える
13

使用する:

theNumber.toLocaleString();

正しい小数と千の区切り記号で適切にフォーマットされた文字列を取得するには

于 2010-01-18T10:30:32.347 に答える
2

私の知る限り、javascript自体.は小数の区切り文字しか知りません。私がJSのことについて信頼している判断に同意する少なくとも1人の人:

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

于 2010-01-18T10:29:54.417 に答える