字符串到双精度数字.(格式为 ##.###,##)

本文关键字:格式 双精度 数字 字符串 | 更新日期: 2023-09-27 18:30:31

我需要知道是否有办法解析具有非普通格式的stringdouble,例如:

string str = "1.500,43";

double num = 1500.43;

我的尝试不起作用。我得到0

double number=0;
double.TryParse("1.500,43", out number);

我知道我可以删除"."并将","更改为".",而不是TryParse,但我想找到另一种方法。

有谁知道如何做到这一点?

字符串到双精度数字.(格式为 ##.###,##)

如果不对double.TryParse方法使用任何IFormatProvider,则默认情况下它会使用您的CurrentCulture

可能您的CurrentcCultureNumberDecimalSeparator或/和NumberGroupSeparator属性与,.不匹配。

作为解决方案,您可以.Clone CurrentCulture并设置这些属性,例如;

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ",";
culture.NumberFormat.NumberGroupSeparator = ".";
double number;
if(double.TryParse("1.500,43", NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
                   culture, out number))
{
    // Successful parsing
}

通常,将.,替换为字符串方法不是一个好主意。

在尝试转换字符串时,您需要告诉TryParse使用哪种区域性。您拥有的格式是欧洲大陆使用的格式,带有十进制逗号和千位分隔符的句号。

您可以先尝试英文格式,如果失败,然后再尝试大陆格式,但如果省略千位分隔符,在某些情况下会转换为有效但不同的数字。

最好坚持以一种格式输入数字,或者从用户的区域设置中选择格式。尽管如果您有人从不同的区域使用该网站(例如德国的英国人),后一种方法可能会失败。

假设你的CultureInfo是德语,你可以使用这个:

var culture = new CultureInfo("de");
double number = 0;
double.TryParse("1.500,43", NumberStyles.Number, culture, out number);

当然,这也适用于小数分隔符和千位分隔符不同的其他区域性。只需使用您所在国家/地区的文化代码

你可以调用 .ToString 和 .使用以下参数解析

new System.Globalization.NumberFormatInfo()

可以在其上将"数字十进制分隔符"属性设置为逗号。

这样,您就不需要弄乱文化信息,而是可以按需设置。

编辑:像这样

double.Parse("1.500,43", new System.Globalization.NumberFormatInfo()
                                                  {
                                                      NumberDecimalSeparator = ",",
                                                      NumberGroupSeparator = "."
                                                  });