如何将"12,4"转换为十进制en-Us文化

Ana*_*mar 8 c# cultureinfo

我有一个十进制值("133,3")存储在挪威文化中的数据库的字符串列中.

之后,用户将区域设置更改为english-Us.当我使用CultureInfo.InvariantCulture将"133,3"转换为十进制时,获取无效值或错误.

有没有最好的方法来处理C#应用程序中的这种情况?

问候,阿南德

Jon*_*eet 17

无论系统文化如何,如果指定,CultureInfo.InvariantCulture将无法将"133,3"解析为133.3的小数.美国英语也是如此.

可以在解析值时指定挪威文化(使用其重载 decimal.TryParse取一个IFormatProvider),或者(最好)更改数据库中的字段以反映实际数据类型(十进制数).

  • +1 - 是的.只有在向用户传递数据或从用户传递数据时才使用特定于文化的代码,例如通过屏幕,电子邮件,打印等.数据库中的标准小数将更好,因为这将允许代码更容易地应对文化的变化. (3认同)

Sai*_*ala 9

你是否提到过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();
      }                     
   }
}
Run Code Online (Sandbox Code Playgroud)


Row*_*haw 5

如果您知道在保留值时使用的区域性,则可以在解析它时使用它,即:

Convert.ToDecimal("133,3", System.Globalization.CultureInfo.GetCultureInfo("no"));
Run Code Online (Sandbox Code Playgroud)

当然,最好更改数据在数据库中的存储方式,以使用某种形式的浮点数。


Shr*_*bhu 5

Convert.ToDouble(textBox2.Text, new CultureInfo("uk-UA")).ToString(new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)