非英文区域下带小数分隔符值调用InvariantCulture的ToString未达预期问题
问题原因
你的代码没有得到预期结果的核心原因是:sourceValue本身是string类型。.NET中字符串类型的ToString()方法无论传入什么CultureInfo参数,都只会原样返回字符串本身的内容,不会触发任何区域性相关的格式转换逻辑,所以两次输出都是原始的0,123。
区域性格式转换规则只对实现了IFormattable接口的非字符串类型生效,比如数值、日期、时间这类类型。你要实现德式数字格式到中立文化格式的转换,不能直接对原始字符串调用ToString,必须先把原始字符串按照对应区域规则解析成强类型数值,再用目标文化规则输出字符串。
正确实现代码
using System.Globalization; string sourceValue = "0,123"; // 第一步:按照当前系统的德语区域规则,把字符串解析为十进制数值 // 德语区域中逗号是小数分隔符,可以正常解析"0,123" if (decimal.TryParse(sourceValue, NumberStyles.Number, CultureInfo.CurrentCulture, out decimal parsedNumber)) { // 第二步:对数值类型调用ToString,传入InvariantCulture得到中立格式 string target_invariant = parsedNumber.ToString(CultureInfo.InvariantCulture); // 不传参数则使用当前系统区域(德语)格式化 string targetValue = parsedNumber.ToString(); Console.WriteLine(target_invariant); // 输出 0.123,符合预期 Console.WriteLine(targetValue); // 输出 0,123 }
注意事项
- 不要尝试直接用字符串替换逗号为点的方式做转换,这种方式遇到带千位分隔符的数字(比如德式格式的
1.234,56对应中立格式的1234.56)会直接出错。 - 解析时必须明确指定和原始字符串匹配的区域规则,避免在不同系统语言环境下出现解析失败的问题。
内容的提问来源于stack exchange,提问作者CodingLearner
相关产品推荐
相关产品推荐

