【问题标题】:CultureInfo's NumberFormat.PercentPositivePattern has been changed on my Windows 10 MachineCultureInfo 的 NumberFormat.PercentPositivePattern 在我的 Windows 10 机器上已更改
【发布时间】:2019-11-12 22:40:00
【问题描述】:

当 selenium 在我的本地计算机上测试 .net 核心应用程序时,我注意到我的百分比字符串 (.ToString("p2")) 在数字和 % 之间没有显示空格,这与我们测试服务器的页面不同。经过一番研究,我的 Windows 10 盒子上的文化信息似乎已经发生了某种变化。有谁知道如何将其重置为默认值?还是更改设置?

get-culture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)


(get-culture).NumberFormat

CurrencyDecimalDigits    : 2
CurrencyDecimalSeparator : .
IsReadOnly               : True
CurrencyGroupSizes       : {3}
NumberGroupSizes         : {3}
PercentGroupSizes        : {3}
CurrencyGroupSeparator   : ,
CurrencySymbol           : $
NaNSymbol                : NaN
CurrencyNegativePattern  : 0
NumberNegativePattern    : 1
PercentPositivePattern   : 1
PercentNegativePattern   : 1
NegativeInfinitySymbol   : -∞
NegativeSign             : -
NumberDecimalDigits      : 2
NumberDecimalSeparator   : .
NumberGroupSeparator     : ,
CurrencyPositivePattern  : 0
PositiveInfinitySymbol   : ∞
PositiveSign             : +
PercentDecimalDigits     : 2
PercentDecimalSeparator  : .
PercentGroupSeparator    : ,
PercentSymbol            : %
PerMilleSymbol           : ‰
NativeDigits             : {0, 1, 2, 3…}
DigitSubstitution        : None

PercentPositivePattern 和 PercentNegativePattern 设置为 1 而不是 0。此外,当其他框显示为 false 时,IsReadOnly 似乎为 true。

检查了我的地区信息。一切看起来都是正确的。

【问题讨论】:

  • 你为什么要这个空间?如果您尝试在服务器和本地计算机之间交换数据并发现它们没有正确解析,那么您应该使用 InvariantCulture。特定于文化的格式会随着时间而改变。
  • 我们正在为我们当前的项目设置自动化测试。其中一项测试是检查以确认某些历史数据已正确加载并正确显示在历史查找页面上。可能应该解析页面数据并使用正确的数据类型进行比较,而不是比较字符串。 (代码是由一个新员工编写的,到目前为止,我一直在努力改进框架而不是单独测试。)

标签: windows powershell cultureinfo


【解决方案1】:

确实,在最新版本的 Windows 10 中,en-US 文化中的百分比格式已经改变[1]

Windows 7:

PS> (1).ToString("p2")
100.00 %  # Space between number and "%"

Windows 10 版本 1903:

PS> (1).ToString("p2")
100.00%   # NO space between number and "%"

要恢复当前线程的旧行为(不是全局的,也不是持久的),您可以执行以下操作:

$c = [cultureinfo]::CurrentCulture.Clone()  # Clone the current culture.
$c.NumberFormat.PercentPositivePattern = 0  # Select the old percentage format.
$c.NumberFormat.PercentNegativePattern = 0  # For negative percentages too.
[cultureinfo]::CurrentCulture = $c  # Make the cloned culture the current one.

此后,(1).Tostring('p2') 再次生成 100 %

注意:在Windows PowerShell / .NET Framework 中,您也可以修改[cultureinfo]::CurrentCulture 的属性直接(无需克隆)。虽然这简化了解决方案,但请注意它在 PowerShell Core / .NET Core 中不再受支持,其中预定义的文化是只读的。

# Windows PowerShell / .NET Framework (as opposed to  .NET Core) ONLY
PS> [CultureInfo]::CurrentCulture.NumberFormat.PercentPositivePattern = 0; (1).ToString("p2")
100.00 %

退后一步:

正如Eric MSFT 注释:

特定文化的格式会随着时间而改变。

为了跨时代和文化的格式稳定性,您应该使用不变的文化,InvariantCulture(强调):

文化敏感数据不同,可能会因用户自定义或更新 .NET Framework 或操作系统而发生变化不变的文化数据随着时间的推移和已安装的文化是稳定的,并且不能由用户自定义。这使得不变区域性对于需要与区域性无关的结果的操作特别有用,例如保留格式化数据的格式化和解析操作,或者需要以固定顺序显示数据而不考虑区域性的排序和排序操作。


[1] Sean1215(OP)报告说,更改一定发生在 OS build 14393 和 16299 之前的某个时间。由于组织中不同团队基于组策略的 Windows 更新计划不同,他的计算机碰巧使用的版本比同事的更新。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2017-07-08
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多