如何让非英文Windows系统下的C#插值字符串始终使用点作为小数分隔符
确保C#插值字符串中小数分隔符始终为点的方法
问题场景
我准备了一段C#代码,在在线运行环境测试时,插值的double值能正确使用点作为小数分隔符(已参考Tim的方法更新,在此致谢):
using System; using System.Linq; public class Program { readonly static (double lng, double lat)[] Locations = { (10.757938, 52.437444), (10.764379, 52.437314), (10.770562, 52.439067), (10.773268, 52.436633), }; public static void Main() { string lngLats = Locations.Aggregate(string.Empty, (str, next) => str + $"{next.Item1:F6},{next.Item2:F6};"); Console.WriteLine($"lngLats: {lngLats}\n"); double x = 12.3456; Console.WriteLine($"A double value: {x}\n"); } }
但在我的Windows 10 Enterprise 22H2电脑(系统语言为英文,但区域设置为德语)上使用Visual Studio 2022运行相同代码时,小数分隔符变成了逗号:

我想知道:如何确保插值字符串中的小数分隔符始终为点?
解决方案
要强制使用点作为小数分隔符,核心是指定格式化时的文化信息,以下是几种可行方法:
方法1:在插值表达式中指定不变文化
直接在字符串插值时,为每个数值指定InvariantCulture(该文化默认使用点作为小数分隔符):
// 修改后的插值逻辑 string lngLats = Locations.Aggregate(string.Empty, (str, next) => str + $"{next.Item1.ToString("F6", System.Globalization.CultureInfo.InvariantCulture)},{next.Item2.ToString("F6", System.Globalization.CultureInfo.InvariantCulture)};"); // C# 6+更简洁的写法 string lngLats = Locations.Aggregate(string.Empty, (str, next) => str + $"{next.Item1:F6} {System.Globalization.CultureInfo.InvariantCulture},{next.Item2:F6} {System.Globalization.CultureInfo.InvariantCulture};");
方法2:临时修改线程文化设置
如果需要批量处理多个格式化操作,可以临时切换当前线程的文化为不变文化,操作完成后恢复原设置:
using System.Globalization; using System.Threading; // 保存原文化信息 var originalCulture = Thread.CurrentThread.CurrentCulture; try { // 切换为不变文化 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; // 执行格式化操作 string lngLats = Locations.Aggregate(string.Empty, (str, next) => str + $"{next.Item1:F6},{next.Item2:F6};"); Console.WriteLine($"lngLats: {lngLats}\n"); double x = 12.3456; Console.WriteLine($"A double value: {x}\n"); } finally { // 恢复原文化 Thread.CurrentThread.CurrentCulture = originalCulture; }
方法3:全局设置默认文化
如果希望整个项目默认使用不变文化进行格式化,可在项目入口处添加全局配置(适用于.NET Core/.NET 5+):
using System.Globalization; // 设置全局默认文化 CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; // 后续所有格式化操作都会默认使用不变文化
内容的提问来源于stack exchange,提问作者Alexander Farber
相关产品推荐
相关产品推荐

