String to Int 的細節

Q:如何把string解析爲int
A:簡單的方法有三種:
string source = "1412";
int result = 0;

// 使用Convert.ToInt32(string value);
result = Convert.ToInt32(source);

// 使用Int32.Parse(string value);
result = Int32.Parse(source);

// 使用Int32.TryParse(string s, out int result);
Int32.TryParse(source, out result);
Q:這三種方法有什麼不同?
A:一個簡單的回答是:
如果解析失敗,Int32.Parse(source)總會拋出異常;Convert.ToInt32(source)sourcenull的情況下不會拋出異常而是簡單的返回0給調用方;而Int32.TryParse(source, result)則無論如何都不拋出異常,只會返回truefalse來說明解析是否成功,如果解析失敗,調用方將會得到0值。
Q:如果我要解析的字符串的字面數值不是十進制的話,那麼從這些方法中得到的返回值是有問題的。有什麼方法解決?
A:那麼你就需要這些方法的對應重載版本了,一個簡單的方法是使用Convert類的
public static int ToInt32(string value, int fromBase);
其中fromBase的值只能爲2810或者16,用於指定進制方式。如果fromBase不是指定的數值或者value不爲十進制而又帶有前綴正負號,就會拋出ArgumentException
string source = "0x1412"; // 這裏的0x(或0X)前綴是可選的。
int result = Convert.ToInt32(source, 16);
當然,你還可以通過爲Int32類的
public static int Parse(string s, NumberStyles style);
指定NumberStyles.AllowHexSpecifier或者NumberStyles.HexNumber爲第二個參數來解析十六進制字面值的字符串,此時,你需要引用System.Globalization命名空間。
或者使用Int32類的
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out int result);
並指定NumberStyles.AllowHexSpecifier或者NumberStyles.HexNumber爲第二個參數,null爲第三個參數來解析十六進制字面值的字符串。你當然也應該引用System.Globalization命名空間。
這裏有一點要提醒的是,無論使用Parse或者TryParse方法來解析十六進制,字符串都不能出現0x0X前綴,否則將會拋出異常。
Q:如果我要把使用科學記數法表示的string轉換爲int又該如何呢?
A:你可以通過把NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent(把兩個NunberStyles枚舉進行位運算,其中前者說明可能存在小數點,而後者則說明可能存在科學記數法的指數符號)作爲第二個參數傳遞給Int32類的
public static int Parse(string s, NumberStyles style);
或者
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out int result);
如果解析出來的結果與int不兼容的,就要考慮把結果儲存在別的類型了。例如"1.412e2"就應該把解析結果存放到float或者double或者decimal類型的變量裏,當然,你也應該使用與儲存變量相對應的類型的方法來解析:
double result = Double.Parse("1.412e2", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
整個字符串表達式應該沒有任何任何空格,否則將有可能拋出異常。
科學記數法的格式爲[{+|-}]m.dddddd{e|E}[{+|-}]xx,可以分解爲以下幾種形式:
·                 [-]m.dddddde+xx
·                 [-]m.dddddde-xx
·                 [-]m.ddddddE+xx
·                 [-]m.ddddddE-xx
下面列舉一些不能正常解析的:
·                 "1.412 e3"
·                 "1.412E 3"
·                 "1.412e +3"
·                 "141200E- 2"
Q:如何處理待解析string裏所包含的空格?
A:對於字符串的前綴或後綴空格,你同樣有多種選擇,一般情況下,你可以直接使用String類的
public string Trim();
來取掉頭尾可能包含的空格:
int result = Int32.Parse(textBox1.Text.Trim());
又或者,你使用NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite來告訴ParseTryParse待解析字符串的頭尾可能包含着空格。
int result = Int32.Parse(textBox1.Text, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);
如果待解析的字符串使用科學記數法來表示,那麼你可以
int result = Int32.Parse(" 1.412e3 ", NumberStyles.Float);
其中NumberStyles.Float告訴Parse方法待解析的字符串可能前綴或後綴的空格、前綴正負號、(十進制)小數點、科學記數法指數表示等。
Q:如何處理貨幣字符串的解析?
A:你可以通過指定NumberStyles.Currency來告訴ParseTryParse待解析的字符串是貨幣樣式的。NumberStyles.Currency說明待解析字符串可能包含前綴或後綴空格、前綴正負號、十進制小數點、千分位符號、字面數值可能爲整數或小數等:
int result = Int32.Parse(" $1,412 ", NumberStyles.Currency);
貨幣樣式字符串不能帶有任何十六進制符號。另外,貨幣樣式字符串格式的相關設定以Region and Languages Options(區域與語言選項)裏面的設定爲基準。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章