web-dev-qa-db-ja.com

フロートを解析する最良の方法は?

CSharpでフロートを解析する最良の方法は何ですか? TryParseについては知っていますが、特に気になっているのはドット、コンマなどです。

ウェブサイトに問題があります。私の開発サーバーでは、「、」は小数を表し、「。」はセパレータ用。ただし、prodサーバーでは、逆になります。どうすればこれをキャプチャできますか?

39
Boris Callens

入力の送信元に依存します。

ユーザーからの入力の場合、ユーザー/ページが使用しているCultureInfoを使用する必要があります( Thread.CurrentThread.CurrentUICulture )。

HttpRequest.UserLanguages プロパティを見ると、ユーザーの文化を取得して示すことができます。 (100%正しくありませんが、非常に良い最初の推測であることがわかりました)その情報を使用して、ページの先頭で Thread.CurrentThread.CurrentUICulture を設定できます。

入力が内部ソースからのものである場合、 InvariantCulture を使用して文字列を解析できます。

Parseメソッドは、入力が制御されたソースからのものである場合、多少使いやすくなります。つまり、文字列はすでに検証されています。 Parseは、失敗すると(遅い)例外をスローします。

入力が制御されていない場合(ユーザーまたはその他のインターネットソースから)、 TryParse の方が見やすくなります。

25
GvS

Leppieの返信に同意します。コードの面でそれを置くには:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
47
Marc Gravell

内部目的で値(数値、日付、時刻など)を保持する場合。値をフォーマットおよび解析するために、常に「InvariantCulture」を使用します。 「InvariantCulture」は、すべてのコンピューター、ユーザーの文化/言語/などのすべてのOSで同じです...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);
6
TcKs

使用するカルチャを含む Parse のオーバーロードを常に使用できますか?

例えば:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

すべてのデータを制御できる場合は、すべてのコードで「CultureInfo.InvariantCulture」を使用する必要があります。

6
Davy Landman

Try/Parseで解析するときは、ニュートラルカルチャー(または既知のカルチャー)を使用します。

3
leppie

フロートを解析するカルチャを表す CultureInfo または NumberFormatInfo を渡します。これは、小数点、グループ区切りなどに使用される文字を制御します。

たとえば、「。」文字は、CultureInfo.InvariantCultureで渡すことができる10進数のインジケーターとして扱われました(これは、通常、環境の文化に関係なく、物事を同じにしたいサーバーアプリケーションで非常に便利です)。

1
Greg Beech

ソースはWebサイトからの入力です。有効であることに頼ることはできません。そこで、前述のようにTryParseを使用しました。しかし、currentCultureをどのように与えるかはわかりません。

また、これにより、現在実行されているサーバーの文化がわかりますが、World Wide Webであるため、ユーザーはどこからでもアクセスできます。

0
Boris Callens

Float.Parseを避けるようにしてください。代わりにTryParseを使用してください。パフォーマンスは向上しますが、同じ仕事をします。これは、double、DateTimeなどにも適用されます。

(一部のタイプでは、TryParseExactも提供されており、パフォーマンスもさらに向上しています!)

簡単なステートメントでサーバーの現在の状態を知ることができます:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

CurrentUICultureプロパティがありますが、UICultureはResourceMeanagerフォームの多言語アプリケーションから使用されることに注意してください。数値の書式設定には、CurrentCultureを考慮する必要があります。

これがお役に立てば幸いです

0
stefano m