尽管数字格式,c# 如何正确读取 double 的字符串?

c# how can I read String of double correctly despite the number Format?

大家好,我的问题是这个。我用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# 自动识别安装的 pc 的 "Culture",以便它可以正确读取数字???

如果你想检测 Culture,你应该可以使用 thislink CultureInfo.CurrentCulture returns 中所述 Culture 来自 Windows GetUserDefaultLocaleName 函数。

is there a way that make c# automatically recognised the "Culture" of the pc where is installed so that it can read the number correctly?

这就是它在默认情况下所做的事情 - 以及您遇到问题的原因,因为用于创建您正在解析的值(“2.3658”)的区域性不是您本地计算机上的区域性。

对于任何特定的值,您真的应该知道是哪种文化产生了它。对于机器对机器的通信,最好使用不变文化(CultureInfo.Invariant),它大部分类似于美国。理想情况下,您根本不应该 存储 特定文化格式的值;将它们存储在二进制表示而不是字符串中,或​​者如果您必须存储字符串,请将其视为有效的机器对机器通信。

如果您不幸收到数据,您知道数据是根据某种人类文化格式化的,但您不知道是哪一种,您可能应该使用一些试探法来检测文化是什么。但是,这很容易失败 - 例如,“1,234”是指 1 后跟 "grouping" 分隔符,然后是 234 - 表示一千、二百三十四......或者它的意思是是一个 1 后跟一个小数点分隔符,使值略大于 1?两种解释都有效,具体取决于您使用的文化...

is pretty spot on (as usual). I just wanted to add that if you are developing an application that will be used by people in another country, it may be helpful for you to use CultureInfo.DefaultThreadCurrentUICulture当你处于开发模式时:只需在应用程序启动时将用户的文化分配给这个属性,你将拥有完全相同的使用体验(文化相关的东西-明智的)您的用户将拥有。 (请记住在发布应用程序时删除它!例如,您可以使用 #if debug 块)