CSharp で float を解析する最良の方法は何ですか? TryParseについては知っていますが、特に疑問に思っているのは、ドット、コンマなどです。
ウェブサイトに問題があります。私の開発サーバーでは、「,」は小数用で、「.」は「.」です。セパレーター用。ただし、prod サーバーでは逆です。どうすればこれを最もよく捉えることができますか?
CSharp で float を解析する最良の方法は何ですか? TryParseについては知っていますが、特に疑問に思っているのは、ドット、コンマなどです。
ウェブサイトに問題があります。私の開発サーバーでは、「,」は小数用で、「.」は「.」です。セパレーター用。ただし、prod サーバーでは逆です。どうすればこれを最もよく捉えることができますか?
leppie の回答に同意します。それをコードの観点から言えば:
string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
入力がどこから来ているかによって異なります。
入力がユーザーからのものである場合は、ユーザー/ページが使用している CultureInfo ( Thread.CurrentThread.CurrentUICulture ) を使用する必要があります。
HttpRequest.UserLanguagesプロパティを調べることで、ユーザーのカルチャを取得して示すことができます。(100% 正しくはありませんが、最初の推測としては非常に適切であることがわかりました) その情報を使用して、ページの先頭にThread.CurrentThread.CurrentUICultureを設定できます。
入力が内部ソースからのものである場合は、InvariantCultureを使用して文字列を解析できます。
入力が制御されたソースからのものである場合は、Parse メソッドを使用する方がいくぶん簡単です。つまり、文字列はすでに検証済みです。解析が失敗すると、(遅い) 例外がスローされます。
入力が制御されていない場合 (ユーザーまたはその他のインターネット ソースから)、TryParseの方が適切に見えます。
内部目的で値 (数値、日付、時刻など) を保持する場合。値のフォーマットと解析には常に「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 で解析するときは、ニュートラル カルチャ (または既知のカルチャ) を使用します。
float を解析するカルチャを表すCultureInfoまたはNumberFormatInfoを渡します。これは、小数点、グループ区切りなどに使用される文字を制御します。
たとえば、「.」文字は、CultureInfo.InvariantCulture で渡すことができる 10 進数のインジケーターとして扱われました (これは通常、環境のカルチャに関係なく物事を同じにしたい傾向があるサーバー アプリケーションで非常に役立ちます)。
簡単なステートメントでサーバーの現在のCukltureを知ることができます。
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;
CurrentUICultureプロパティがありますが、UICultureはResourceMeanagerフォームの多言語アプリケーションから使用されることに注意してください。数値の書式設定については、CurrentCultureを考慮する必要があります。
これがお役に立てば幸いです
ソースはウェブサイトからの入力です。私はそれが有効であることに頼ることはできません。そこで、前述のように TryParse を使用しました。しかし、 currentCulture をそれに与える方法がわかりません。
また、これは現在実行されているサーバーの文化を教えてくれますが、それはワールドワイドウェブであるため、ユーザーはどこからでも...
float.Parse を避けるようにしてください。代わりに TryParse を使用してください。パフォーマンスははるかに優れていますが、同じ仕事をします。これは、double、DateTime などにも適用されます...
(一部のタイプでは、TryParseExact も提供されており、これはさらに優れたパフォーマンスを発揮します!)
Webユーザーの文化がわからないため、推測を行うことができます。区切り文字とを使用するカルチャを使用したTryParse。10進数の場合、および。を使用するカルチャを使用したTryParse。区切り文字の場合、および小数の場合。両方とも成功したが、異なる答えが得られた場合は、ユーザーにどちらを意図したかを尋ねる必要があります。それ以外の場合は、2つの等しい結果、1つの使用可能な結果、または使用可能な結果がない場合は、通常どおり続行できます。