C#中十进制数值输出为错误格式分数的问题求助
C# Double类型输出时小数点变为斜杠问题排查与解决
问题产生原因
- .NET中数值类型调用默认
ToString()方法、或被String.Join隐式转换为字符串时,会默认使用当前运行线程的**区域性配置(CultureInfo)**作为格式化规则。 - 你当前运行环境的区域性配置中,数字格式的小数分隔符被设置为了
/而非默认的.,因此0.23这类小数在转字符串时就会被格式化为0/23。
修复方案
方案1:格式化时强制指定不变区域性(最推荐,不受环境配置影响)
在转换数值为字符串时显式指定使用不随环境变化的不变区域性,修改拼接代码如下:
using System.Globalization; // 先对每个double元素单独格式化再拼接 objStr += "Weights: [" + String.Join(",", weightItems.Select(d => d.ToString(CultureInfo.InvariantCulture))) + "]\n"; return objStr;
方案2:全局统一当前线程的小数分隔符
如果整个程序都需要固定使用.作为小数分隔符,可以在程序启动入口处配置全局区域性:
using System.Globalization; // 放在程序初始化逻辑(如Main方法)的最开头 var numberFormat = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; numberFormat.NumberDecimalSeparator = "."; CultureInfo.CurrentCulture.NumberFormat = numberFormat; CultureInfo.CurrentUICulture.NumberFormat = numberFormat;
方案3:显式指定小数输出格式
如果你需要固定保留2位小数,也可以直接指定格式化字符串:
objStr += "Weights: [" + String.Join(",", weightItems.Select(d => d.ToString("0.00"))) + "]\n"; return objStr;
注:该方案同样会默认使用当前区域性,如果要完全避免环境影响,可在格式化字符串后追加不变区域性参数:
d.ToString("0.00", CultureInfo.InvariantCulture)
内容的提问来源于stack exchange,提问作者humayra
相关产品推荐
相关产品推荐

