在你的个人主页上,它说你来自韩国。这就是为什么我假设你现在的文化是ko-KR
。 (和你said以及。)
而且它的NumberDecimalSeparator
是.
但它的NumberGroupSeparator
是,

你Convert.ToDouble
作品和它假定你,
是成千上万的分隔符,而不是小数分隔符。这就是为什么你的dthou
将是1000
而不是1
。
Convert.ToInt32(string)
明确使用Int32.Parse(string, CultureInfo.CurrentCulture)
并且这种方法implemented like;
public static int Parse(String s, IFormatProvider provider)
{
return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}
正如您所见,此方法使用NumberStyles.Integer
作为默认值。这就是为什么你的字符串可以成功解析,只有它包含其中之一;
而且,由于你的字符串有数以千计的分隔符或小数点分隔符(这取决于哪一个时使用的)这个方法抛出异常。
取而代之的是,你可以用它Int32.Parse(String, NumberStyles, IFormatProvider)
overload可以指定你的NumberStyles
像NumberStyles.AllowDecimalPoint
或NumberStyles.AllowThousands
作为一个例子;
string str = "1,000";
int ithou = Int32.Parse(str, NumberStyles.AllowThousands,
new CultureInfo("ko-KR"));
Console.WriteLine(ithou); // Prints 1000
如果你想获得1
结果,你可以使用CultureInfo.Clone
method到你的文化,并设置它的NumberDecimalSeparator
和NumberGroupSeparator
性能喜欢;
string str = "1,000";
CultureInfo c = (CultureInfo)CultureInfo.GetCultureInfo("ko-KR").Clone();
c.NumberFormat.NumberDecimalSeparator = ",";
c.NumberFormat.NumberGroupSeparator = ".";
int dthou = Int32.Parse(str, NumberStyles.AllowDecimalPoint, c);
Console.WriteLine(dthou); // Prints 1
我不认为这是一个文化问题。这是格式化字符串的不一致处理 。 ToDouble用逗号接受字符串,但 ToInt32不。这就像回到原来的问题, ,但不能ToInt32接受逗号,就像 ToDouble函数?
哦,我亲爱的朋友,你还在想错了..
一切都在你的情况下,一个文化问题。没有这样的事情“Convert.ToDouble()
接受逗号字符串,但Convert.ToInt32()
不”。
让我们再来看看这些方法是如何实现的。
Convert.ToDouble(string)
明确使用Double.Parse(value, CultureInfo.CurrentCulture)
并且它是implemented like;
public static double Parse(String s, IFormatProvider provider)
{
return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.GetInstance(provider));
}
有了这个NumberStyles.Float| NumberStyles.AllowThousands
,你可以在你的代码中使用两个小数点或千位分隔符,但,
是你的文化的NumberGroupSeparator
没有NumberDecimalSeparator
。这就是为什么你的字符串将被解析为千位分隔符。 没有这样的事情Convert.ToDouble使用逗号的字符串。它可以使用您当前的文化的NumberDecimalSeparator
或NumberGroupSeparator
取决于您的字符串具有哪个字符。如果两者相等,NumberDecimalSeparator
将占主导地位并将被使用。
Convert.ToInt32(string)
明确使用Int32.Parse(string, CultureInfo.CurrentCulture)
并且它是implemented like;
public static int Parse(String s, IFormatProvider provider)
{
return Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));
}
正如我之前所说,NumberStyles.Integer
允许你的字符串有三样东西;领先的白色空间,尾随的白色空间和领先的积极或消极的迹象。无论是逗号还是点号,您的字符串都有小数点分隔符或千位分隔符不能解析。
但不能ToInt32被实现为接受逗号,就像 ToDouble函数?
我以前告诉过你。 Convert.ToInt32
没有过载需要NumberStyles
作为参数。您可以使用Int32.Parse(String, NumberStyles, IFormatProvider)
overload,您可以指定NumberStyles
枚举来解析您的小数点分隔符或千位分隔符。
您目前的文化是什么? –
这似乎是一个文化问题。 – Flater
CultureInfo.CurrentCulture.Name告诉我“ko-KR” – Keugyeol