質問

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

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

私の最初のアプローチは、文字列を取得し、区切り文字が見つかるまで逆方向に解析し、これを小数区切り文字として使用することです。それには明らかな欠陥があります。10.000 は 10 として解釈されます。

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

明らかな「最善の解決策」は、ユーザーの文化またはブラウザを検出することですが、フランス人が米国版 Windows/ブラウザを使用している場合は機能しません。

.net Framework には、より優れた神話的な黒魔術の浮動小数点パーサーが含まれていますか? Double.(Try)Parse() 数値形式を自動検出しようとしていますか?

役に立ちましたか?

解決

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

他のヒント

ASP.NET 側の問題はわかりませんが、.NET には非常に強力なクラスがあります。 システム.グローバリゼーション.カルチャー情報. 。次のコードを使用して、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 に渡します。これらは正常に機能します。

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

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);

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

たとえば、人(赤ちゃんや子供を含む)の身長を mm 単位で考えてみましょう。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top