C# 十进制分隔符?

16

我有一个返回类似以下数字的方法:

public decimal GetNumber()
{
    return 250.00m;
}

现在当这个值被输出到控制台时,例如它有一个逗号(250,00)而不是一个点(250.00)。我始终想要一个点,我做错了什么?


6
如果你不知道的话,“,”被用作小数分隔符号在许多欧洲国家,例如德国、法国、意大利等。也许你的文化设置是其中之一? - Matt Ellen
我在控制台应用程序中测试了这个函数,对我来说运行良好。显示为点(250.00)。 - Andrei Bularca
4个回答

50

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

1
System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo("de-DE"); decimal d = 0.3m; string s1 = d.ToString(germanCultureInfo); -> s1 是 0.3 而不是 0,3。为什么? - Offler
1
@Offler:我无法重现那个问题 - 那个确切的代码给我的结果是“0,3”。 - Jon Skeet
1
发生在客户机器上。正在搜索互联网以找出原因...现在在客户的电脑上找到了解决方案——更改了Windows设置。 - Offler
1
我猜 Convert.ToString() 比 d.ToString() 更安全;@JonSkeet - ManirajSS
通过参考此链接,我了解到https://dev59.com/y3RC5IYBdhLWcg3wVvnL#326071。如果对象为空,则Tostring()可能会抛出异常。但是Convert.Tostring()将处理空对象并返回string.Empty。但在您的答案中,d是非可空的,所以没有问题(如果它是可空的,则可能会引发错误)。如果我错了,请纠正我,传奇。:) @JonSkeet - ManirajSS
显示剩余2条评论

7

正如Jon Skeet所解释的那样,您应该指定用于格式化字符串的文化:

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

在IT技术中,一个好的实践是始终使用指定区域性的ToString重载。否则,.NET将使用当前线程的Culture,这会根据PC的语言环境不同而输出不同的strings...


1
另一方面,如果我们不是在谈论 Web 应用程序,那么使用 PC 上的当前区域设置可能是首选行为。毕竟,这就是用户习惯看到的。 - Fredrik Mörk
2
是的,我同意你的观点。当字符串将用于 UI 时,这是有效的行为。但是,当字符串用于执行某种序列化时,这可能是一个真正的问题。在这种情况下,反序列化可能会因执行 PC 区域设置而失败...并且在产品在不同区域设置的平台上发布之前,您看不到这一点。我更喜欢花几秒钟时间思考它(并做出合理的决定),而不是以后后悔。 - Eilistraee

1

0

我已经使用Visual Studio 2008(控制台应用程序)进行了检查,它没有显示“,”而是显示“。”,请提供更多细节。我认为这是Culture-Info的问题,请提供更多代码细节。

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接