2017-11-07 3 views
1

私は適用し、特定のCultureInfoに番号を正規化しようと苦労してるの小数を含む文字列そのNumberFormatノーマライズ特定CultureInfo.NumberFormat

のは、私もいくつかの文字を含む文字列があるとしましょう、そうIそれをクリーンアップする必要があります。

var cleanedInput = Regex.Replace(userInput, @"[^0-9-,'.]+", ""); 

だから私は基本的に,'.を保っています。 CultureInfoに応じて、,.は、小数点を区切ったり、数値をグループ化したりするために使い方が異なるため、私はこれを行っています。

は心の中で、私は小数とIFormatProviderはdinamically CultureInfo.NumberFormat所望の「ローカル」に適用されようとしている許可するNumberStyleを指定して、Decimal.TryParse方法を適用することを持ちます。

decimal numericData; 
if (!decimal.TryParse(cleanedInput, NumberStyles.AllowDecimalPoint, LocaleUser.NumberFormat, out numericData)) 
    throw new Exception($"Error occurred. Could not parse:{cleanedInput} "); 

"hi9000,99hi"と入力します。一度清掃されると、"9000,99"となります。ニース。 それで、TryParseを適用し、Decimal9000.99を返します。私が実際にes-ESCultureInfoを小数点区切り文字として,に適用しているという重要なことです。私は基本的に9000,99または9.000,99を期待しています。

コードはExceptionを発行していませんが、指定したCultureInfoが適用されていないようです。

私は正確に何が欠けていますか? Decimal.TryParseは私がよく扱っているスイス軍ナイフだという気持ちがあります。

事前に感謝します。

+2

私は問題が何であるかを正確にわからないんだけど、小数点形式を_have_ないことを覚えておいてください。値を表示するときに書式を指定します。デバッガで見ている場合は、マシンが設定されているすべてのカルチャを使用します。値を特定の形式で表示するには、 'decimal.ToString'または' string.Format'を使用します。 –

+1

明確にするために、あなたが提供するコードは例外を発生させていますか?そして、 'cleanedInput'はあなたがパーサに入る前に期待しているものですか? –

+0

皆様にお返事ありがとうございます。コードは例外を発生させませんが、私が得ている出力は、私が指定したCultureInfoと、それがデバッグされている場所のVS2015を使用しているCultureInfoを適用していません。 – Gonzo345

答えて

0

double.Parse、decimal.Parseまたはdecimal.TryParseを使用しているようです。 CultureInfoはどのように定義されましたか?

string value = "9000,99"; 
decimal number; 
CultureInfo culture = CultureInfo.CreateSpecificCulture("es-ES"); 

try { 
    number = decimal.Parse(value, culture); 
    decimal.TryParse(value, NumberStyles.Any, culture, out decimal num); 
    Console.WriteLine($"{culture.Name}: {value} = {number}/{num}");      
} catch (FormatException) { 
    Console.WriteLine($"{culture.Name}: Unable to parse [{value}]"); 
} 

出力:

es-ES: 9000,99 = 9000.99/9000.99 
+0

私は最終的に私が間違っていたことを得ました、そして、私の実際のマシンのCultureInfoによって "修正された"最終出力を解釈していました。ところで、CultureInfoはpropで指定されました:) – Gonzo345

0

だから、小数は常に10進数と述べたコメントのように、何の形式を持っていないだろうことを考えると、私は間違って質問に注力し、私がありました探している!

私は最終的に、このメソッドを使用しています:

private decimal CleanUserInput(string userInput, CultureInfo localeUser) 
{ 
    if (localeUser == null) 
     throw new Exception("A CultureInfo must be specified. "); 

    var cleanedInput = Regex.Replace(userInput, @"[^0-9-,\.']+", ""); 
    if (string.IsNullOrWhiteSpace(cleanedInput)) 
     throw new Exception("Data provided has no numbers to be parsed. "); 

    decimal numericData; 
    if (!decimal.TryParse(cleanedInput, NumberStyles.Any, localeUser, out numericData)) 
     throw new Exception($"Couldn't parse {cleanedInput} . Make sure the applied CultureInfo ({LocaleUser.DisplayName}) is the correct one. Decimal separator to be applied: <{LocaleUser.NumberFormat.NumberDecimalSeparator}> Numeric group separator to be applied: <{LocaleUser.NumberFormat.NumberGroupSeparator}>"); 

    return numericData; 
}