【问题标题】:How to convert "12,4" to decimal en-Us culture如何将“12,4”转换为十进制 en-Us 文化
【发布时间】:2011-12-01 13:00:32
【问题描述】:

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

在该用户将区域设置更改为英语-Us 之后。当我使用 CultureInfo.InvariantCulture 将“133,3”转换为十进制时,得到无效值或错误。

C# 应用程序中是否有处理这种情况的最佳方法?

问候, 阿南德

【问题讨论】:

  • 你能说得清楚点吗?这意味着是 133 小数点 3,还是 1333...?
  • 也检查一下这个:stackoverflow.com/questions/831727/…
  • "133,3" 在挪威文化中,逗号用作小数分隔符。

标签: c# cultureinfo


【解决方案1】:

无论系统文化如何,如果您指定 CultureInfo.InvariantCulture,您将无法将“133,3”解析为十进制到 133.3。美式英语也是如此。

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

【讨论】:

  • +1 - 是的。仅在向/从用户传递数据时使用特定于文化的代码,例如通过屏幕、电子邮件、打印等。数据库中的标准小数会好得多,因为这将使代码更容易应对文化的变化。
【解决方案2】:

你提到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();
      }                     
   }
}

【讨论】:

  • 我试过了:“en-US”和“de-DE” ----- 1.234,56: US: FormatException;德国:1234.56 -> 好的 ----- 1,234.56:美国:1234.56; DE: FormatException -> OK ----- 234.56: US: 234.56; DE:23456 -> 不正常 ----- 234,56:美国:23456; DE: 234.56 -> 不好 ----- 抱歉,没有换行符有点混乱:/
【解决方案3】:

如果您知道持久化值时使用的文化,则可以在解析时使用它,即:

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

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

【讨论】:

    【解决方案4】:
    Convert.ToDouble(textBox2.Text, new CultureInfo("uk-UA")).ToString(new CultureInfo("en-US"));
    

    【讨论】:

    • 欢迎来到stackoverflow!最好为示例代码提供简短的描述以提高发布的准确性:)
    【解决方案5】:

    这解决了你的问题:.ToString(New CultureInfo("en-US"))

    【讨论】:

      【解决方案6】:

      希望对你有帮助

      double _number = 12536,8;
      
      CultureInfo usCulture = new CultureInfo("en-US");
      
      return _number.ToString("N", us);
      

      【讨论】:

        【解决方案7】:

        使用下面的代码来解决我的问题。我只是硬编码了以前的货币小数部分。可能不是通用的。但解决了我的问题。

        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);
            }
        

        【讨论】:

          猜你喜欢
          • 2016-10-02
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          • 2015-09-13
          • 2013-10-08
          • 2014-01-25
          • 2013-10-30
          • 1970-01-01
          相关资源
          最近更新 更多