使用文化格式进行双重解析

21

我有一个双精度浮点数的字符串。这个数字是

202.667,40

即202667.4

如何解析该字符串以获得类似于Double.Parse("202.667,40",?在这里填什么)的值,或者通过其他方法获得该值也可以。谢谢。


6
请使用以逗号作为小数点的文化信息(例如德国)。最好匹配字符串来自的国家。 - Hans Passant
7个回答

35

首先,你需要知道这个数字来自哪个文化背景,然后:

CultureInfo culture = new CultureInfo("de"); // I'm assuming german here.
double number = Double.Parse("202.667,40", culture);
如果您想使用当前线程的文化来解析,这默认是为当前用户设置的文化:
double number = Double.Parse("202.667,40", CultureInfo.CurrentCulture);

4
当我使用“de”时,会引发NotSupportedException异常。“'de'文化是一种中性文化。它不能用于格式化和解析,因此不能设置为线程的当前文化。”也许您想使用“de-DE”? - Jeffrey LeCours

11

我认为我已经找到了一个不需要特定文化的解决方案。使用 NumberFormatInfo,您可以强制格式化输出,无论文化如何:

// This is invariant
NumberFormatInfo format = new NumberFormatInfo();
// Set the 'splitter' for thousands
format.NumberGroupSeparator = ".";
// Set the decimal seperator
format.NumberDecimalSeparator = ",";

之后:

System.Diagnostics.Debug.WriteLine(double.Parse("202.667,40", format)));

输出:
202667,4

当然,这个输出(内部 toString())可能因区域设置而异!
请注意,将输入更改为“202,667.40”将导致解析错误,因此格式应与您期望的输入匹配。

希望这能帮助某些人..


3
你可以使用Double.Parse(your_number, CultureInfo.CurrentCulture),并根据Thread.CurrentThread.CurrentCulture设置CurrentCulture。
例如:
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");

稍后再说。
Double.Parse(your_number, CultureInfo.CurrentCulture);

请注意,如果您明确将文化赋值给CurrentThread,则仅适用于该线程。

3

与其在所有解析中指定语言环境,我更喜欢设置应用程序范围的语言环境,但如果应用程序中字符串格式不一致,则可能无法实现。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-PT");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-PT");

在应用程序的开头定义这个设置,将使得所有的双精度解析都期望逗号作为小数分隔符。


1
我在Xamarin中遇到了一个大问题。这个方法对我有用。谢谢。 - Gs.

2

为了更加灵活,您可以设置NumberDecimalSeparator

string number = "202.667,40";
double.Parse(number.Replace(".", ""), new CultureInfo(CultureInfo.CurrentCulture.Name) {NumberFormat = new NumberFormatInfo() {NumberDecimalSeparator = ","}});

2

1
Double.Parse("202.667,40", new System.Globalization.CultureInfo("de-DE"));

不要使用 de-DE,而是使用字符串所在的任何文化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接