web-dev-qa-db-ja.com

カルチャ不変のDecimal.TryParse()

カルチャを無視するDecimal.TryParseを使用する必要がある(つまり、入力に小数点区切り文字として "。"または "、"が含まれているかどうかは気にしません)、10進数バリデーターにカスタム文字列を記述しています。これが推奨される方法です。

public static bool TryParse(
    string s,
    NumberStyles style,
    IFormatProvider provider,
    out decimal result
)

3番目のパラメーターとして何を使用するかわかりません。私が見た例は次のようになります。

culture = CultureInfo.CreateSpecificCulture("en-GB");
Decimal.TryParse(value, style, culture, out number)

彼らは特定の文化を創造します。 CultureInfoには「CreateInvariantCulture」メソッドがなく、CultureInfo.InvariantCultureは必要なタイプではありません。正しい使い方は何ですか?

30
Shaggydog

このようにしてみてください:

decimal value;
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);

最善の方法は、Decimal.Parse()メソッドを使用することです。これは、従来の10進文字列値の場合と同じです。

NumberStyles.Currencyを使用して、値を通貨として読み込むように指定できます。これにより、通貨関連の値が処理されます(これを使用するには、System.Globalalizationへの参照を追加する必要があります。

using System.Globalization;

Decimal.Parseは3番目のパラメーターも受け入れます。これにより、特定のCultureを選択して希望する場合は、IFormatProviderを明示的に設定できます。

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55
50
Nayeem Mansoori

私の悪者。次のコードをテストしました。

        string DutchDecimal = "1,5";
        string EnglishDecimal = "1.5";
        decimal a;
        decimal b;
        Console.WriteLine(decimal.TryParse(DutchDecimal, out a));
        Console.WriteLine(a);
        Console.WriteLine(decimal.TryParse(EnglishDecimal, out b));
        Console.WriteLine(b);
        Console.Read();

そして、両方の文字列を正しく解析します。デフォルトのTryParseは確かにカルチャ不変のようです。 EnterpriseLibraryのデフォルトのTypeConversionValidatorはカルチャ依存であり、TryParseを使用するだけであるため、これは事実ではないと想定しました。ただし、このデフォルトのパーサーは、現在のカルチャを使用するようにハードコードされています。

編集:私は「1.5」が1.5に変換し、「1,5」が15に変換することを発見しました。これは実際にカルチャ不変の動作に正しいので、そこにあります。この質問全体は、文化の不変条件がどのように機能するかについての私の誤解によって生じたようです。

7
Shaggydog

実際には CultureInfo.InvariantCultureはここで使用できます。このパラメーターは、IFormatProviderが実装するインターフェースであるCultureInfoを想定しています。ただし、InvariantCultureは、ユーザーの設定によって変化しないという意味で不変です。

実際、次のいずれかを受け入れる文化はありません,または.小数点記号として–それらはすべてどちらかです。これらの小数点区切り記号のいずれかを使用できるデータを処理する他の方法を見つける必要があります。

4
David Heffernan

3番目のパラメーターとして何を使用するかわかりません。

すべてのカルチャ NumberDecimalSeparator または NumberGroupSeparator などは同じではないためです。

誰かが.NumberDecimalSeparatorとして、誰かが,しかし、CultureInfoとして両方を使用するNumberDecimalSeparatorはありません。

CultureInfo 実装 IFormatProvider インターフェイス。 CultureInfoを指定すると、value文字列がそのカルチャルールで解析されます。

カルチャを無視するDecimal.TryParseを使用する必要がある10進数バリデーターにカスタム文字列を書いています

そのような場合、 CultureInfo.Clone method 必要なカルチャのコピー(または InvariantCulture )で、NumberDecimalSeparatorとNumberGroupSeparatorに必要な文字列を設定できます。

1
Soner Gönül