如何将CultureInfo.InvariantCulture设置为默认值?

40

当我在C#中有如下代码:

double a = 0.003;
Console.WriteLine(a);

它会输出"0,003"。

如果我有另一段代码:

double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));

它会打印出"0.003"。

我的问题是我需要一个点作为小数点,但是C#默认使用逗号。此外,我不想为了打印出一个双精度变量而输入那么长一行代码。


当您在不同的文化环境中部署应用程序时会发生什么? - Jodrell
1
@Jodrell,这是服务器上的一个任务,我的程序将以错误答案(WA)结束。 - nhtrnm
你应该说明为什么你“需要”一个点。听起来像是你想要写入某个导出文件之类的东西。请看下面我的回答。 - Designpattern
可能是如何为整个C#应用程序设置默认的Culture Info的重复问题。 - Martin Valgur
C#并不是“默认使用逗号”。您运行代码的环境或计算机将其文化设置为使用逗号作为小数点。设置InvariantCulture有效,因为您告诉它使用不变的文化格式化数字(这类似于默认文化)。在代码中更改文化可能根本不是正确的答案,这取决于此软件面向的用户。 - MGOwen
7个回答

59

您可以将当前线程的区域设置为任何您想要的区域:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

请注意,更改区域设置也会影响字符串比较和排序、日期格式以及日期和数字的解析。


3
这段代码应该放在我的项目的哪里? - Rapunzo
4
@Rapunzo:您可以将其放置在任何每个请求都会运行的地方,例如在global.asax中的Application_BeginRequest或页面类中的第一个事件中。 - Guffa
3
@JanHudec:当您启动新线程时,不会继承文化。 Thread 类中有一个静态成员确定新线程的文化。更多阅读:http://blog.rastating.com/setting-default-currentculture-in-all-versions-of-net/ - Guffa
1
嗯...我认为这不是一个好的解决方案。在单线程应用程序中可能还可以,但在多线程环境中这不会起作用(好吧,它只会对执行此行的线程起作用)。 - Gianluca Ghettini
@GianlucaGhettini:指定线程的文化的重点在于它不会影响其他线程。还有一种方法是为整个应用程序设置文化(请参见Aghilas Yakoubs的答案),因此您可以在三个级别上指定文化;全局、线程或每次调用。对于某些应用程序,将文化设置为全局工作正常,但其他应用程序需要其他级别。 - Guffa
显示剩余3条评论

33

自 .NET Framework 4.5 和 .NET Core/Standard 1.0 版本以来,您可以通过修改 CultureInfo.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUICulture 属性来更改整个应用程序的区域设置,而不仅仅是当前线程的区域设置:

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

10

1 空字符串在config.file中指定为InvariantCulture。

默认情况下,在config中Culture和UICulture被设置为空字符串。

   <system.web>
      <globalization culture="" />
   </system.web>

2 你也可以在你的Thread上定义。


请注意,这仅适用于IIS。如果您使用Kestrel或希望使用适用于两者的解决方案,请使用其他答案。 - dimaaan

6

C#默认不会将逗号作为分隔符,这取决于你的文化背景。尝试显式设置文化背景。

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

链接: http://msdn.microsoft.com/en-us/library/ms425914(v=office.12).aspx

该链接为微软官方文档,介绍了如何在Office应用程序中使用XML数据。此文档提供了示例代码和详细的说明,以帮助开发人员理解在Office中使用XML数据的过程。

3
当您调用WriteLine()并输入一个double类型的值时,它内部会进行如下调用:
Console.WriteLine(a.ToString(CultureInfo.CurrentCulture));

现在的任务是将CurrentCulture替换为InvariantCulture。以下代码可完成此操作:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

现在你的线程已经设置为InvariantCulture,你的第一个调用也应该打印出"0.003"。

3
您可以像@Guffa和其他人所示的那样将 CultureInfo.InvariantCulture 设置为默认值。
但是您必须明确为什么这样做。如果您进行数据导入/导出操作,则可以使用它,但可能不适用于向用户呈现的字符串。
Microsoft文档说明如下:
不同于与文化相关的数据,后者可以通过用户自定义或.NET Framework或操作系统的更新而发生变化,因此不变文化具有长期稳定性和跨安装文化的特点,并且不能被用户自定义。这使得不变文化在需要文化无关结果的操作中特别有用,例如持久格式化和解析操作或需要按固定顺序显示数据的排序和排序操作。要创建 CultureInfo 实例,可以使用一个空字符串("")命名不变文化。

2
如果您不想要数字和日期的特定于文化的格式,可以在应用程序启动时设置一次文化。
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture

如果是ASP.NET应用程序,一个更简单的替代方法是在web.config的<globalization>配置元素中设置区域性。
否则,您没有太多选择,只能明确指定区域性。如果发现自己反复输入相同的长行代码,请像往常一样将其包装在一个方法中。

使用thread.currentThread.currentculture设置文化只会影响当前线程。 - Gianluca Ghettini

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