c#如果格式化数字怎么能正确读取双精度字符串?

时间:2015-09-17 07:15:17

标签: c# visual-studio double cultureinfo

大家好我的问题是这个。我在c#中制作了一个能够读取和编辑dxf文件的软件,我必须将这个软件交给一家美国公司,但我发现了以下问题:

我居住的地方使用','将整数部分与数字的小数部分分开(例如:2,3658),但在美国,他们使用'。'所以他们写了2.3658。 当我尝试读取字符串" 2.3658"并使用" Double.Parse(" 2.3658")"将其转换为双精度数。我获得的双倍是23658,就像方法" Parse()"没有认出小数部分。 我找到了以下解决方案:

 UpdatedCoorx = double.Parse(shiftedE[w + 1] ,NumberStyles.Number,CultureInfo.CreateSpecificCulture ("en-US"));

使用CultureInfo.CreateSpecificCulture(" en-US")c#可以正确读取数字。 我的问题是:有没有办法让c#自动识别" Culture"安装的电脑,以便它可以正确读取数字???

3 个答案:

答案 0 :(得分:3)

  

有没有办法让c#自动识别安装的电脑的“文化”,以便能正确读取数字?

默认情况下它正在做什么 - 以及为什么你遇到问题,因为用于创建你正在解析的值的文化(“2.3658”)不是你本地机器上的文化。

对于任何特定的价值,你应该真正了解哪种文化产生了它。对于机器到机器的通信,最好使用与美国类似的 的不变文化(CultureInfo.Invariant)。理想情况下,您不应该以文化特定的格式存储值;要么将它们存储为二进制表示而不是字符串,要么必须存储字符串,请将其视为有效的机器间通信。

如果您处于接收数据的不幸位置,您知道它已根据某些人类文化格式化,但您不知道哪一个,您应该使用一些启发式方法来检测文化是什么。这很容易失败 - 例如,“1,234”意味着是1后面跟着一个“分组”分隔符,接着是234 - 意思是一千二百三十四......或者它意味着是一个1后跟一个小数分隔符,使得该值略大于1?这两种解释都是有效的,取决于您使用的文化......

答案 1 :(得分:0)

如果您想检测Culture,您应该可以使用this执行此操作 正如link CultureInfo.CurrentCulture中所述,返回Windows Culture函数中的GetUserDefaultLocaleName

答案 2 :(得分:0)

Jon's answer非常适合(像往常一样)。我只是想补充一点,如果您正在开发一个将由其他国家/地区的人使用的应用程序,那么在您处于开发模式时使用CultureInfo.DefaultThreadCurrentUICulture可能会有所帮助:只需将用户的文化分配给此应用程序启动时的属性,您将拥有与用户完全相同的使用体验(与文化相关的事物)。 (只需记住在发送应用程序时删除它!例如,您可以使用#if debug块)