在您的个人资料中,显示您来自韩国。这就是为什么我假设您当前的文化是ko-KR。 (还有你said。)
它是NumberDecimalSeparator 是. 但它是NumberGroupSeparator 是,
您的Convert.ToDouble 有效,它假定您的, 是千位分隔符,而不是十进制分隔符。这就是为什么你的dthou 将是1000 而不是1。
Convert.ToInt32(string) 显式使用Int32.Parse(string, CultureInfo.CurrentCulture),此方法implemented 喜欢;
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 喜欢;
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;
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 枚举来解析小数分隔符或千位分隔符。