C# Win11切换到俄语、葡萄牙语,浮点型字符串转换报错System.FormatException:“Input string was not in a correct format.”
是因为在葡萄牙语中,小数部分用","(逗号)分隔,而不是使用C#默认的"."(点)。
解决上面的问题
string portugueseNumber = "0,5"; double value = double.Parse(portugueseNumber); Console.WriteLine(value);
或者
var str = 1.1; var value = double.Parse(str.ToString()); Console.WriteLine(value);
或者
var str = "1.0"; var value = double.Parse(str, new CultureInfo("en")); Console.WriteLine(value);
推荐第二种,应该不需要使用硬编码字符串记录一个数字,从源头解决该问题。
在WPF中不要使用数字传参,会直接变成字符串类型,这种可能会遇上上面的问题,
应该增加一个浮点类型的资源
或者使用x:Static引入静态字段值
最近又遇到一个情况在葡萄牙语言环境下使用Xml序列化到本地后再反序列化报错
因为序列化的对象存在double类型,而Xml的值全部都会先转成string类型,反序列化再自动将string类型转成double类型的。
<versions> <version value="10,002"/> </versions>
上面的就是保存起来的值,可以看到double类型的小数点符号已经因为转了字符串变成了,号。
但是XmlSerializer.Deserialize反序列化内部的类型转成无法将"10,002"识别成double类型,所以报错了。
用Json就不会有这个问题,因为Json是能够区别数值型和字符型的。
{"name": "Jack", "age": 30.211}
只要不主动将double类型转成字符串保存,再反序列化成字符串后将字符串转double这些多此一举的操作,数值型就存数值就不会出现这个问题。
所以如果你的应用需要考虑国际化的场景,那么就应该使用Json替换Xml方案。
还可以直接在应用入口把改成线程统一使用英语,那么1.1.ToString()返回1.1,转换也不会出现问题
//默认线程内外部统一使用英语的,小数默认都是.号分割,CurrentUICulture不变 CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");