【问题标题】:<decimal>.ToString("P3") returns differerent results on Win7 and Windows 10<decimal>.ToString("P3") 在 Win7 和 Windows 10 上返回不同的结果
【发布时间】:2018-03-14 15:12:24
【问题描述】:

我有两个盒子:一个 Win7 和另一个 Win10(还有一个 Windows Server 2012 盒子,它的行为与我的 Win10 盒子相同)。

在所有盒子上都安装了 .NET 版本 4.5.2。

当我运行以下代码时:

Dim d As Decimal = 1.23
Console.WriteLine((d / 100D).ToString("P3"))

然后我在 Win7 上得到这个结果:

 1,230%

在 Win 10 和 Windows Server 2012 上我得到这个结果:

 1,230 %

注意百分号前的空格。

谁能帮我弄清楚为什么会这样?我仔细检查了 .NET 版本,它们都是 4.5.2,所以这可能与操作系统有关吗?

非常感谢大家。

更新:

使用

Console.WriteLine((d / 100D).ToString("P3", CultureInfo.InvariantCulture))

我在所有机器上都得到了这个结果:

 1,230 %

但是输出的时候

Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name)

在我得到的所有机器上

de-DE

我原以为文化一定会因为产生不同的结果而表现出不同的东西,但由于一切都是 de-DE,我仍然不明白为什么不同操作系统上的输出会有所不同。

更新 2

...还有这个

Console.WriteLine((d / 100D).ToString("P3", CultureInfo.GetCultureInfo("de-DE")))

Win7 上的结果:

 1,230%

在 Win 10 和 Windows Server 2012 上我得到这个结果:

 1,230 %

很奇怪,相同的文化,不同的输出......

【问题讨论】:

    标签: .net vb.net operating-system .net-4.5


    【解决方案1】:

    "P" 格式说明符对区域性敏感,如 Microsoft .NET Standard Numeric Format Strings documentation

    Decimal.ToString(string, IFormatProvider) 重载中使用 CultureInfo.InvariantCulture 以实现跨系统的一致、与文化无关的结果:

    Dim d As Decimal = 1.23
    Console.WriteLine((d / 100D).ToString("P3", CultureInfo.InvariantCulture))
    

    更新

    CultureInfo.InvariantCulture 告诉格式化方法忽略特定于线程的文化设置并使用随时间和机器保持一致的特殊通用文化。

    根据不同版本的 Windows 的特定文化不同:

    One comment on different question 表明这在 Windows 7 和 Windows 8 之间已更改。

    但是,我认为您的问题更具哲学性。随着时间的推移,文化敏感的字符串看起来总是不同的。

    一件事是软件部分 - 在 Windows 7 之前,百分比模式甚至不可用,因此您的字符串在 Vista 上可能已经看起来不同了。

    另一件事是现实世界及其不断变化的条件。想象一下这种情况:明年您可能会在您的国家/地区获得新的语法规则,这些规则将指定要使用的不同格式。 Microsoft 将发布更新,调整默认设置以匹配这些规则。但是,在给定的时间点,会有一些用户没有安装更新,因此会得到不同的字符串。有些用户可能多年不更新。

    您的程序是否有必要重新实现与文化相关的细节,还是应该由操作系统负责?拥有自己的文化规则将使您的程序看起来很奇怪,因为该计算机上的大多数其他程序将具有与操作系统一致的文化规则(除非他们的作者决定也重新实现文化)。当然,还有一个问题是微软是否应该在 Windows 版本之间的百分比格式中添加这个空格。但恐怕那艘船几年前就已经航行了,我们只能忍受它。同样,它会影响文化敏感的字符串,这些字符串无论如何都会随着时间而改变。

    如果你真的必须这样做,我想你最好的选择是为每个线程克隆文化并设置CultureInfo.NumberFormat.PercentPositivePattern = 1;

    【讨论】:

    • 你似乎在做某事,但我仍然想知道结果,你能检查我在原帖中的更新吗?
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多