web-dev-qa-db-ja.com

「12,4」を10進数のen-Us文化に変換する方法

ノルウェーの文化では、データベースの文字列列に10進値( "133,3")が格納されています。

その後、ユーザーは地域の設定を英語-米国に変更しました。 CultureInfo.InvariantCultureを使用して「133,3」を10進数に変換すると、無効な値またはエラーが発生します。

C#アプリケーションでこのシナリオを処理するための最良の方法はありますか?

よろしく、アナンド

9
Anand Kumar

システムカルチャに関係なく、CultureInfo.InvariantCultureを指定すると、は「133,3」を小数として133.3に解析できなくなります 。同じことがアメリカ英語にも当てはまります。

あなたcouldは、値を解析するときにノルウェーの文化を指定するだけです(IFormatProviderを取る decimal.TryParse のオーバーロードを使用します)、または(できれば)データベースのフィールドを変更して、代わりに実際のデータ型(10進数)を反映します。

19
Jon Skeet

Convert.ToDecimal() を参照しましたか?

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] values = { "123456789", "12345.6789", "12 345,6789",
                          "123,456.789", "123 456,789", "123,456,789.0123",
                          "123 456 789,0123" };
      CultureInfo[] cultures = { new CultureInfo("en-US"),
                                 new CultureInfo("fr-FR") }; 

      foreach (CultureInfo culture in cultures)
      {
         Console.WriteLine("String -> Decimal Conversion Using the {0} Culture",
                           culture.Name);
         foreach (string value in values)
         {
            Console.Write("{0,20}  ->  ", value);
            try {
               Console.WriteLine(Convert.ToDecimal(value, culture));
            }
            catch (FormatException) {
               Console.WriteLine("FormatException");
            }
         }
         Console.WriteLine();
      }                     
   }
}

値を永続化するときに使用されていたカルチャがわかっている場合は、それを解析するときに使用できます。

Convert.ToDecimal("133,3", System.Globalization.CultureInfo.GetCultureInfo("no"));

もちろん、何らかの形式の浮動小数点数を使用するには、データベースへのデータの格納方法を変更したほうがよいでしょう。

6
Rowland Shaw
Convert.ToDouble(textBox2.Text, new CultureInfo("uk-UA")).ToString(new CultureInfo("en-US"));
5
Shrikant Prabhu

これで問題が解決します:.ToString(New CultureInfo( "en-US"))

2
Chris

私の問題を修正するために以下のコードを使用しました。前の通貨の小数部分をハードコーディングしました。ジェネリックではないかもしれません。しかし、私の問題は解決しました。

public static decimal? ToDecimal1(this string source)
    {
        CultureInfo usCulture = new CultureInfo("en-US");

        if (string.IsNullOrEmpty(source.Trim1()))
            return null;
        else
            return Convert.ToDecimal(source.Replace(",", ".").Trim(), usCulture);
    }
0
Anand Kumar