You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让非英文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运行相同代码时,小数分隔符变成了逗号:

VS2022运行截图

我想知道:如何确保插值字符串中的小数分隔符始终为点?

解决方案

要强制使用点作为小数分隔符,核心是指定格式化时的文化信息,以下是几种可行方法:

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:16:19