升级至Windows 10 1709后double.ToString("P")输出异常咨询
Windows 10 1709后
double.ToString("P")格式变更的问题解决 这个问题我碰到过不少开发者反馈,确实是Windows 10 1709版本对系统文化的百分比格式定义做了调整导致的。
问题原因
微软在Windows 10 1709(秋季创意者更新)中,更新了部分文化区域的NumberFormatInfo.PercentPattern属性值。比如常见的英语(美国)、英语(英国)等文化,原来的百分比格式模式是"0.00 %"(数值后加空格再加百分号),更新后被改成了"0.00%"(数值和百分号直接相连)。这就导致double.ToString("P")的输出和更新前不一致,虽然MSDN旧文档描述的是带空格的格式,但系统层面的格式定义已经发生了变更。
可行解决方案
因为你提到不能更换文化区域或修改用户设置,这里给几个不用改动系统设置的方案:
1. 自定义NumberFormatInfo局部使用
创建当前文化的副本,修改其百分比格式模式后,传递给ToString方法使用:
// 克隆当前文化,避免修改系统默认设置 var modifiedCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo; // 设置PercentPattern为1,对应"0.00 %"格式(不同数值对应不同模式,1是数值+空格+百分号) modifiedCulture.NumberFormat.PercentPattern = 1; // 使用修改后的文化进行格式化 double value = 1.0; string formattedValue = value.ToString("P", modifiedCulture); // 输出结果为"100.00 %"
注:PercentPattern的可选值对应格式:
- 0:
"%0.00"(百分号在前) - 1:
"0.00 %"(数值+空格+百分号) - 2:
"0.00%"(数值+百分号无空格)
2. 全局设置应用级文化格式
如果希望整个应用都使用旧的百分比格式,可以在应用启动时设置自定义的全局文化:
// 创建当前文化的副本 var customCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo; customCulture.NumberFormat.PercentPattern = 1; // 设置当前线程及后续线程的默认文化 CultureInfo.DefaultThreadCurrentCulture = customCulture; CultureInfo.DefaultThreadCurrentUICulture = customCulture; // 之后所有ToString("P")都会使用带空格的格式 double value = 1.0; string formattedValue = value.ToString("P");
注意:多线程应用需要确保线程启动时继承这个文化设置,部分场景可能需要单独处理线程文化。
3. 直接使用硬编码格式字符串(简单场景)
如果你的应用只需要固定的带空格百分比格式,不需要适配不同文化的小数位数等规则,可以直接写死格式字符串:
double value = 1.0; string formattedValue = value.ToString("0.00 %"); // 输出"100.00 %"
这种方式最直接,但灵活性差,如果需要根据文化自动调整小数位数,还是建议用前两种方案。
内容的提问来源于stack exchange,提问作者Andrew Faerber
相关产品推荐
相关产品推荐

