71

多文化プログラミングの楽しい部分の 1 つは、数値形式です。

  • アメリカ人は 10,000.50 を使用します
  • ドイツ人は 10.000,50 を使用します
  • フランス語使用 10 000,50

私の最初のアプローチは、文字列を取得し、セパレーターに遭遇するまで逆方向に解析し、これを小数点として使用することです。これには明らかな欠陥があります: 10.000 は 10 として解釈されます。

別のアプローチ: 文字列に 2 つの異なる非数値文字が含まれている場合、最後の文字を小数点記号として使用し、残りを破棄します。1 つしかない場合は、複数回発生するかどうかを確認し、発生する場合は破棄します。1 回しか表示されない場合は、その後に 3 桁あるかどうかを確認します。はいの場合は破棄し、そうでない場合は小数点記号として使用します。

明らかな「最善の解決策」は、ユーザーのカルチャまたはブラウザーを検出することですが、en-US Windows/ブラウザーを使用しているフランス人がいる場合、それは機能しません。

.net フレームワークにはDouble.(Try)Parse()、数値形式の自動検出を試みるよりも優れた、神話上の黒魔術の浮動小数点パーサーが含まれていますか?

4

4 に答える 4

31

この場合にできる最善のことは、彼らの意見を取り入れて、彼らが何を意味していると思うかを示すことだと思います。同意しない場合は、期待している形式を示して、もう一度入力してもらいます。

于 2008-08-01T23:17:53.657 に答える
27

問題の ASP.NET 側はわかりませんが、.NET にはかなり強力なクラスSystem.Globalization.CultureInfoがあります。次のコードを使用して、double 値を含む文字列を解析できます。

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

ASP.NET が何らかの方法で (つまり、HTTP 要求ヘッダーを使用して) 現在のユーザーの CultureInfo を CultureInfo.CurrentCulture または CultureInfo.CurrentUICulture に渡す場合、これらは正常に機能します。

于 2008-08-01T20:02:08.357 に答える
12

みんなを喜ばせることはできません。私が 10 を 10.000 と入力し、誰かが 10,000 を 10.000 と入力した場合、入力の文化についてある程度の知識がなければ、それを処理することはできません。何らかの方法で文化を検出する (ブラウザー、システム設定 - ユース ケースは? ASP? 内部アプリ、または世界に開かれている?)、または予想される書式設定の例を提供し、できる限り寛大なパーサーを使用します。おそらく次のようなものです:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
于 2008-08-01T20:05:12.750 に答える
10

フランス語と英語の 12.345 の差は 1000 倍です。最大 < 1000*最小の予想範囲を指定すると、簡単に推測できます。

たとえば、人 (赤ちゃんや子供を含む) の身長を mm で表します。

200 ~ 3000 の範囲を使用すると、1.800 または 1,800 の入力は明確に 1 メートルと 80 センチメートルとして解釈できますが、912.300 または 912,300 の入力は明確に 91 センチメートルと 2.3 ミリメートルとして解釈できます。

于 2008-08-02T12:28:12.517 に答える