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");

 

posted @ 2023-09-05 19:43  log9527  阅读(258)  评论(1编辑  收藏  举报