Aar*_*age 0 .net c# floating-point internationalization
我有一个相当奇怪的问题.我有一个非常简单的应用程序,它从csv格式的文件中读取一些数据,并将一个极性"蝴蝶"绘制到一个表单.然而,欧洲国家的一些人改变了一个非常奇怪的曲线,当我修改程序输出一些样本值来尝试和锻炼正在发生的事情时,它只给了我更多的问题!
以下是预期值的示例,以及特定用户获得的内容:
EXPECTED -> SEEN
0.00 0.00 -> 0,00 0,00
5.00 1.35 -> 5,00 1346431626488,41
10.00 2.69 -> 10,00 2690532522738,65
Run Code Online (Sandbox Code Playgroud)
所以右边的所有值(在我的程序中计算)都乘以10 ^ 12!如何在CLR中发生这种情况?第一个数字 - 0,5,10 - 只是由写入输出的简单循环产生,使用:value += 5.
产生这些计算的代码确实使用alglib.net库进行插值,但是从http get返回的xml中提取的其他2个值也会出现问题,然后从弧度转换为度数.
也不是一个问题,但为什么十进制值会用逗号而不是小数点打印?输出代码很简单string.Format("{0:F}", value)
,其中值是double?
那么,为什么一些值会被移动12个小数位,而不是其他值,并且仅在某些国家?是的其他人运行应用程序没有问题...不确定是否有任何相关性,但这个输出来自荷兰.
不同的文化使用不同的千位和小数分隔符.en-US(美国英语)使用","和"." 但de-DE(德国德语)使用"." 和",".这意味着在阅读或写入字符串时,您需要使用适当的文化.当持久化信息供以后检索时,通常意味着CultureInfo.InvariantCulture
.当向用户显示通常意味着的信息时CultureInfo.CurrentCulture
.
您还没有提供从CSV文件中读取的代码,但我想您正在double.Parse(field)
为每个字段执行类似的操作.如果该字段的值为"5.0",则在当前文化为de-DE时解析它"." 将被视为千位分隔符,并且以美国术语将该值读取为50.0.你应该做的是double.Parse(field, CultureInfo.InvariantCulture)
.
所有的Parse
,TryParse
,Format
,和许多ToString
方法接受的IFormatProvider
.养成一直提供适当的格式提供者的习惯,你不会被国际化问题所困扰.
归档时间: |
|
查看次数: |
97 次 |
最近记录: |