CSharpでフロートを解析する最良の方法は何ですか? TryParseについては知っていますが、特に気になっているのはドット、コンマなどです。
ウェブサイトに問題があります。私の開発サーバーでは、「、」は小数を表し、「。」はセパレータ用。ただし、prodサーバーでは、逆になります。どうすればこれをキャプチャできますか?
入力の送信元に依存します。
ユーザーからの入力の場合、ユーザー/ページが使用しているCultureInfoを使用する必要があります( Thread.CurrentThread.CurrentUICulture )。
HttpRequest.UserLanguages プロパティを見ると、ユーザーの文化を取得して示すことができます。 (100%正しくありませんが、非常に良い最初の推測であることがわかりました)その情報を使用して、ページの先頭で Thread.CurrentThread.CurrentUICulture を設定できます。
入力が内部ソースからのものである場合、 InvariantCulture を使用して文字列を解析できます。
Parseメソッドは、入力が制御されたソースからのものである場合、多少使いやすくなります。つまり、文字列はすでに検証されています。 Parseは、失敗すると(遅い)例外をスローします。
入力が制御されていない場合(ユーザーまたはその他のインターネットソースから)、 TryParse の方が見やすくなります。
Leppieの返信に同意します。コードの面でそれを置くには:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
内部目的で値(数値、日付、時刻など)を保持する場合。値をフォーマットおよび解析するために、常に「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);
使用するカルチャを含む Parse のオーバーロードを常に使用できますか?
例えば:
double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
すべてのデータを制御できる場合は、すべてのコードで「CultureInfo.InvariantCulture」を使用する必要があります。
Try/Parseで解析するときは、ニュートラルカルチャー(または既知のカルチャー)を使用します。
フロートを解析するカルチャを表す CultureInfo または NumberFormatInfo を渡します。これは、小数点、グループ区切りなどに使用される文字を制御します。
たとえば、「。」文字は、CultureInfo.InvariantCultureで渡すことができる10進数のインジケーターとして扱われました(これは、通常、環境の文化に関係なく、物事を同じにしたいサーバーアプリケーションで非常に便利です)。
ソースはWebサイトからの入力です。有効であることに頼ることはできません。そこで、前述のようにTryParseを使用しました。しかし、currentCultureをどのように与えるかはわかりません。
また、これにより、現在実行されているサーバーの文化がわかりますが、World Wide Webであるため、ユーザーはどこからでもアクセスできます。
Float.Parseを避けるようにしてください。代わりにTryParseを使用してください。パフォーマンスは向上しますが、同じ仕事をします。これは、double、DateTimeなどにも適用されます。
(一部のタイプでは、TryParseExactも提供されており、パフォーマンスもさらに向上しています!)
簡単なステートメントでサーバーの現在の状態を知ることができます:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
CurrentUICultureプロパティがありますが、UICultureはResourceMeanagerフォームの多言語アプリケーションから使用されることに注意してください。数値の書式設定には、CurrentCultureを考慮する必要があります。
これがお役に立てば幸いです