【问题标题】:C# decimal separator?C# 小数分隔符?
【发布时间】:2011-04-21 16:09:53
【问题描述】:

我有一个方法可以返回这样的数字:

public decimal GetNumber()
{
    return 250.00m;
}

现在当这个值被打印到控制台时,它有一个逗号 (250,00) 而不是一个点 (250.00)。总想在这里给点意见,我做错了什么?

【问题讨论】:

  • 如果您不知道:, 在德国、法国和意大利等许多欧洲国家/地区用作小数分隔符。也许您将自己的文化设置为这些地方之一?
  • 我已经在控制台应用程序中测试了这个功能并且对我来说工作正常。以点 (250.00) 显示。

标签: c# separator decimal


【解决方案1】:

decimal 本身没有格式 - 它既没有逗号也没有点。

只有当你将它转换为字符串时,你才会得到它。您可以通过指定不变的文化来确保得到一个点:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
        decimal d = 5.50m;
        string withComma = d.ToString();
        string withDot = d.ToString(CultureInfo.InvariantCulture);
        Console.WriteLine(withComma);
        Console.WriteLine(withDot);
    }
}

【讨论】:

  • System.Globalization.CultureInfo GermanCultureInfo = new System.Globalization.CultureInfo("de-DE");小数 d = 0.3m;字符串 s1 = d.ToString(germanCultureInfo); -> s1 是 0.3 而不是 0,3 。为什么?
  • @Offler:我无法重现 - exact 代码给了我“0,3”。
  • 发生在客户机器上。正在互联网上搜索以找出原因...现在在客户电脑上找到了解决方案 - 更改了的 Windows 设置。
  • 我猜 Convert.ToString() 会比 d.ToString(); @JonSkeet
  • @ManirajSS:你为什么“猜”这个?您认为哪种方式会“更安全”?
【解决方案2】:

正如 Jon Skeet 所解释的,您应该指定用于格式化 string 的文化:

var str = GetNumber().ToString(System.Globalization.CultureInfo.InvariantCulture);

始终使用指定区域性的ToString 重载是一个好习惯。否则,.NET 使用当前线程Culture,这将根据PC 的语言环境将不同的strings 写入输出...

【讨论】:

  • ...另一方面,使用 PC 上的当前语言环境(假设我们不是在谈论 Web 应用程序)也可能是首选行为。这毕竟是用户习惯看到的。
  • 是的,我同意你的看法。当字符串将在 UI 中使用时,这是一种有效的行为。但是当字符串用于执行某种序列化时,这可能是一个真正的问题。在这种情况下,反序列化可能会失败,具体取决于正在执行的 PC 区域设置……在产品交付到具有不同区域设置的平台之前,您不会看到这一点。我宁愿花几秒钟时间考虑一下(并对此做出合理的决定),也不愿事后后悔。
【解决方案3】:

特定于区域设置的格式?

http://en.wikipedia.org/wiki/File:DecimalSeparator.svg(绿色等于逗号,因此如果您使用这些位置的文化信息在小数点上调用ToString(),您将看到一个逗号)。

【讨论】:

    【解决方案4】:

    我用 Visual Studio 2008(控制台应用程序)检查过它,它没有显示“,”而不是“。” ,请提供更多详细信息。我认为它的文化信息问题。请提供更多代码细节

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write(GetNumber());
        }
        public static  decimal GetNumber()
        {
            return 250.00m;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-22
      • 2016-12-08
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多