C# 如何设置CultureInfo.InvariantCulture默认值?

C# 如何设置CultureInfo.InvariantCulture默认值?,c#,double,C#,Double,当我用C语言编写这样的代码时: 它打印“0003” 如果我有另一段代码: double a = 0.003; Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 它打印“0.003” 我的问题是,我需要一个点作为小数点,但C#将逗号作为默认值。此外,我不想仅仅为了打印一个双变量而键入这么长

当我用C语言编写这样的代码时:

它打印“0003”

如果我有另一段代码:

double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
它打印“0.003”


我的问题是,我需要一个点作为小数点,但C#将逗号作为默认值。此外,我不想仅仅为了打印一个双变量而键入这么长的代码行。

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

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
请注意,更改区域性也会影响字符串比较和排序、日期格式以及日期和数字的解析。

C#默认情况下不会使其成为逗号,这是您的区域性。试着明确地设置文化

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

如果您不想使用特定于区域性的数字和日期格式,可以设置区域性一次,可能是在应用程序启动时

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
如果是ASP.NET应用程序,一个更简单的选择是在web.config的
配置元素中设置区域性


否则,除了显式指定区域性之外,您没有太多选择。如果您发现自己重复键入同一长行代码,请执行在这种情况下经常执行的操作:将其包装在一个方法中。

当您调用
WriteLine()
并输入一个双精度时,它或多或少会在内部执行此调用:

Console.WriteLine(a.ToString(CultureInfo.CurrentCulture));
现在的任务是将
CurrentCulture
替换为
InvariantCulture
。这可以通过以下代码行完成:

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

现在您的线程设置了不变量文化,您的第一次调用也应该打印“0.003”。

1空字符串在
config.file

默认情况下,配置中将区域性和UICulture设置为“”

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


2您还可以在
线程上定义

您可以将
CultureInfo.InvariantCulture
设置为默认值,如@Guffa和其他人所示

但你必须清楚你为什么要这么做。如果您执行数据导出/导入操作就可以了,但是您可能不会将其用于呈现给用户的字符串

Microsoft文档说明:

不变的文化是文化不敏感的;它与 英语,但不适用于任何国家/地区。您可以指定 通过在调用中使用空字符串(“”),按名称固定区域性 CultureInfo实例化方法

与文化敏感数据不同, 它可能会因用户自定义或更新而更改 .NET Framework或操作系统中,固定区域性数据 随着时间的推移和跨已安装的区域性稳定,并且无法 由用户定制。这使得不变的文化变得尤为重要 对于需要区域性独立结果的操作非常有用,例如 作为保存格式化数据的格式化和解析操作,或 排序和排序操作,要求数据显示在 不分文化的固定秩序


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

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

当您在不同的区域性中部署应用程序时会发生什么情况?@Jodrell,这是服务器上的一项任务,我的程序将以错误的答案(WA)结束。您应该说明为什么“需要”一个点。听起来你想写信给某个出口公司。请看下面我的答案。C#的可能副本不是“将逗号作为默认值”。运行代码的环境或计算机的区域性设置为使用逗号表示小数点的位置/语言。设置不变量区域性是有效的,因为您告诉它使用不变量区域性(类似于默认区域性)格式化数字。更改代码中的区域性可能根本不是正确的答案,这取决于此软件是为谁编写的。此代码应该在我的项目中的具体位置编写?@Rapunzo:您可以将其放在为每个请求运行的任何位置,例如在
global.asax中的
应用程序\u BeginRequest
中,或者在您的页面类的第一个事件中。谢谢您,正如您所说,我在我的桌面项目中将其放入MDI表单,numericUpDown的工作正常,但现在datetimes给了我错误。。如果你不介意的话,你能给我一点提示吗?@JanHudec:当你启动一个新线程时,区域性不是继承的,在
thread
类中有一个静态成员,它决定了新线程的区域性。更多阅读:嗯。。。我认为这不是一个好的解决方案。在单线程应用程序中,这可能没问题,但在多线程环境中,这是行不通的(好吧,它只适用于执行该行的线程),使用thread.currentThread.currentculture设置区域性只会影响当前线程