44

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

ウェブサイトに問題があります。私の開発サーバーでは、「,」は小数用で、「.」は「.」です。セパレーター用。ただし、prod サーバーでは逆です。どうすればこれを最もよく捉えることができますか?

4

11 に答える 11

56

leppie の回答に同意します。それをコードの観点から言えば:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
于 2008-09-29T07:30:13.773 に答える
26

入力がどこから来ているかによって異なります。

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

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

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

入力が制御されたソースからのものである場合は、Parse メソッドを使用する方がいくぶん簡単です。つまり、文字列はすでに検証済みです。解析が失敗すると、(遅い) 例外がスローされます。

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

于 2008-09-29T07:31:11.120 に答える
7

内部目的で値 (数値、日付、時刻など) を保持する場合。値のフォーマットと解析には常に「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);
于 2008-09-29T07:28:37.927 に答える
6

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

例えば:

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

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

于 2008-09-29T07:30:45.580 に答える
3

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

于 2008-09-29T07:26:56.697 に答える
1

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

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

于 2008-09-29T07:29:42.247 に答える
0

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

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

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

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

于 2008-09-30T08:26:20.043 に答える
0

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

また、これは現在実行されているサーバーの文化を教えてくれますが、それはワールドワイドウェブであるため、ユーザーはどこからでも...

于 2008-09-30T07:59:48.250 に答える
0

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

(一部のタイプでは、TryParseExact も提供されており、これはさらに優れたパフォーマンスを発揮します!)

于 2008-09-29T07:37:54.643 に答える
-1

Webユーザーの文化がわからないため、推測を行うことができます。区切り文字とを使用するカルチャを使用したTryParse。10進数の場合、および。を使用するカルチャを使用したTryParse。区切り文字の場合、および小数の場合。両方とも成功したが、異なる答えが得られた場合は、ユーザーにどちらを意図したかを尋ねる必要があります。それ以外の場合は、2つの等しい結果、1つの使用可能な結果、または使用可能な結果がない場合は、通常どおり続行できます。

于 2008-09-30T08:24:23.260 に答える