字符串到双精度数字.(格式为 ##.###,##)
本文关键字:格式 双精度 数字 字符串 | 更新日期: 2023-09-27 18:30:31
我需要知道是否有办法解析具有非普通格式的string
来double
,例如:
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
。
可能您的CurrentcCulture
的NumberDecimalSeparator
或/和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 = "."
});