フロートを解析する最良の方法は?
-
02-07-2019 - |
質問
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);
Parse のオーバーロードは常に使用できます。使用する文化?
たとえば:
double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting
すべてのデータを制御できる場合は、「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);
Try / Parseで解析するときは、ニュートラルカルチャ(または既知のカルチャ)を使用します。
CultureInfo または NumberFormatInfo は、フロートを解析するカルチャを表します;これにより、小数、グループ区切りなどに使用される文字が制御されます。
たとえば、「。」文字は、CultureInfo.InvariantCultureで渡すことができる10進数インジケータとして扱われました(これは、通常、環境の文化に関係なく、物事を同じにしたいサーバーアプリケーションで非常に役立ちます)。
float.Parseを避けるようにしてください。代わりにTryParseを使用してください。パフォーマンスは大幅に向上しますが、同じ仕事をします。 これは、double、DateTimeなどにも適用されます。
(一部のタイプでは、さらに優れたパフォーマンスのTryParseExactも提供されています!)
ソースはWebサイトからの入力です。有効であることに頼ることはできません。そのため、前述のようにTryParseを使用しました。 しかし、currentCultureをどのように与えるかはわかりません。
また、これにより、現在実行されているサーバーの文化がわかりますが、World Wide Webであるため、ユーザーはどこからでもアクセスできます...
簡単なステートメントでサーバーの現在の状態を知ることができます:
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
CurrentUICultureプロパティがありますが、UICultureは多言語アプリケーションのResourceMeanagerから使用されることに注意してください。数値のフォーマットについては、CurrentCultureを考慮する必要があります。
これがお役に立てば幸いです
Webユーザーの文化を知らないので、推測することができます。 TryParseを使用するカルチャで、区切り文字と。 10進数ではANDを使用するカルチャを持つTryParse。セパレーター、および10進数の場合。両方とも成功したが、異なる回答が得られた場合は、ユーザーに意図を尋ねる必要があります。それ以外の場合、2つの等しい結果、1つの使用可能な結果、または使用できない結果があれば、正常に続行できます。