質問

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つの使用可能な結果、または使用できない結果があれば、正常に続行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top