VS2017 C#中NumberFormatInfo.CurrentInfo与微软文档不符的问题咨询
解决
$"{value:F}%"格式化返回三位小数的环境差异问题 你的问题核心是系统区域设置覆盖了en-US文化的默认小数位数,F格式符会直接使用当前线程文化的NumberDecimalDigits配置,而这个值读取的是Windows系统的区域格式,和Visual Studio的设置无关——这就是为什么重置VS设置没用的原因。
给你两个针对性的解决思路:
1. 在代码中强制指定格式化文化(推荐用于单元测试)
单元测试的稳定性很重要,不能依赖环境配置。你可以在格式化时明确指定en-US文化或者不变文化,彻底规避环境差异:
// 方式1:用string.Format指定文化 var result = string.Format(CultureInfo.GetCultureInfo("en-US"), "{0:F}%", value); // 方式2:插值字符串结合ToString指定文化(更直观) var result = $"{value.ToString("F", CultureInfo.GetCultureInfo("en-US"))}%"; // 方式3:如果不需要本地化,用不变文化也可以 var result = $"{value.ToString("F", CultureInfo.InvariantCulture)}%";
这样不管你的虚拟机系统区域怎么设置,格式化结果都会严格按照en-US的默认两位小数来输出,保证单元测试的一致性。
2. 修改系统区域格式的小数位数
如果你想让系统默认的en-US文化回到两位小数,可以按以下步骤操作:
- 打开Windows「设置」→「时间和语言」→「区域」
- 在「区域格式」下拉框选择「英语(美国)」,然后点击「更改格式」
- 在弹出的「区域格式设置」窗口中,找到「小数位数」选项,把值改成
2 - 保存设置后,重启Visual Studio(或者直接重启虚拟机),再测试就能看到效果了
为什么你的虚拟机里NumberDecimalDigits是3?大概率是虚拟机初始化时区域配置被修改过,或者Parallels/VirtualBox的虚拟机模板自带了这个设置——毕竟Windows的区域格式是可以自定义的,哪怕选了en-US,也能手动调整小数位数。
内容的提问来源于stack exchange,提问作者Kizmar
相关产品推荐
相关产品推荐

