在你的個人主頁上,它說你來自韓國。這就是爲什麼我假設你現在的文化是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