|
|
|
|
|
|
按照我們平時常用的寫法,TryParse是不能轉換小數和16進制數字、千分位數字等字符串的,要使用TryParse也能轉換小數和16進制數字等字符串,我們需要另外的寫法,當然,還是用TryParse方法來實現。
示例
我們看看下面的示例和執行結果。(環境:ASP.NET 4.0)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization; //該命名空間不能少
public partial class Parse : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string numericString;
NumberStyles styles;
numericString = "106779";
styles = NumberStyles.Integer;
CallTryParse(numericString, styles);
numericString = "-30677";
styles = NumberStyles.None;
CallTryParse(numericString, styles);
styles = NumberStyles.AllowLeadingSign;
CallTryParse(numericString, styles);
numericString = "301677-";
CallTryParse(numericString, styles);
styles = styles | NumberStyles.AllowTrailingSign;
CallTryParse(numericString, styles);
numericString = "$10634";
styles = NumberStyles.Integer;
CallTryParse(numericString, styles);
styles = NumberStyles.Integer | NumberStyles.AllowCurrencySymbol;
CallTryParse(numericString, styles);
numericString = "10345.00";
styles = NumberStyles.Integer | NumberStyles.AllowDecimalPoint;
CallTryParse(numericString, styles);
numericString = "10345.72";
styles = NumberStyles.Integer | NumberStyles.AllowDecimalPoint;
CallTryParse(numericString, styles);
numericString = "22,593";
styles = NumberStyles.Integer | NumberStyles.AllowThousands;
CallTryParse(numericString, styles);
numericString = "12E-01";
styles = NumberStyles.Integer | NumberStyles.AllowExponent;
CallTryParse(numericString, styles);
numericString = "12E03";
CallTryParse(numericString, styles);
numericString = "80c1";
CallTryParse(numericString, NumberStyles.HexNumber);
numericString = "0x80C1";
CallTryParse(numericString, NumberStyles.HexNumber);
}
public void CallTryParse(string stringToConvert, NumberStyles styles)
{
CultureInfo provider;
// 如果允許貨幣符號, 使用 en-US
if ((styles & NumberStyles.AllowCurrencySymbol) > 0)
provider = new CultureInfo("en-US");
else
provider = CultureInfo.InvariantCulture;
int number;
bool success = Int32.TryParse(stringToConvert, styles, provider, out number);
if (success)
Response.Write("轉換 <b>" + stringToConvert + "</b> 到 <b>" + number + "</b><br><br>");
else
Response.Write("嘗試轉換 <b>" + stringToConvert + "</b> 失敗" + "<br><br>");
}
}
輸出
從執行結果看到,TryParse成功轉換了某些小數,以及16進制數字的字符串。但并不是所有小數都能轉換,而對16進制數字字符串的寫法也有所要求。下面對此進行詳細介紹。
TryParse(String, NumberStyles, IFormatProvider, Int32)
將指定樣式和特定區域性格式的數字的字符串表示形式轉換為其等效的 32 位有符號整數。返回值指示轉換是否成功。
public static bool TryParse (string? s, System.Globalization.NumberStyles style, IFormatProvider? provider, out int result);
s String:包含要轉換的數字的字符串。使用style指定的樣式解釋字符串。style NumberStyles:枚舉值的按位組合,指示可以出現在s中的樣式元素。要指定的典型值是Integer。provider IFormatProvider:提供有關s的區域性特定格式信息的對象。result Int32:當此方法返回時,如果轉換成功,則包含與s中包含的數字等效的 32 位有符號整數值,如果轉換失敗,則返回零。如果s參數為null或空、格式不符合style或表示小于MinValue或大于MaxValue的數字,則轉換失敗。此參數未初始化傳遞;最初提供的任何值result都將被覆蓋。布爾值:true,如果s轉換成功;否則,false。
style不是NumberStyles值。
-或者-
style不是AllowHexSpecifier和HexNumber值的組合。
請看文章開頭的示例。
TryParse方法與Parse方法類似,只是TryParse方法在轉換失敗時不會拋出異常。它消除了s在無效且無法成功解析的事件中使用異常處理來測試FormatException的需要。
style參數定義了參數中允許的樣式元素(例如空格或正號或負號)以使s解析操作成功。它必須是NumberStyles枚舉中位標志的組合。根據style的值,s參數可能包括以下元素:
[ws][$][sign][digits,]digits[.fractional_digits][e[sign]digits][ws]
或者,如果style參數包含AllowHexSpecifier:
[ws]十六進制數字[ws]
方括號([ 和 ])中的項目是可選的。下表描述了每個元素。
| 元素 | 描述 |
|---|---|
| ws | 空格可選。空格可以出現在s的開頭,如果style包含NumberStyles.AllowLeadingWhites標志,或者在s的末尾,如果style包含NumberStyles.AllowTrailingWhite標志。 |
| $ | 特定于文化的貨幣符號。它在字符串中的位置由provider參數的GetFormat方法返回的NumberFormatInfo對象的CurrencyPositivePattern屬性定義。如果style包含NumberStyles.AllowCurrencySymbol標志,則可以出現貨幣符號。 |
| sign | 可選標志。如果style包含NumberStyles.AllowLeadingSign或NumberStyles.AllowTrailingSign標志,則s可以出現標志符號。 |
| digits | 從 0 到 9 的數字序列。 |
| , | 特定于文化的千位分隔符。如果style包含NumberStyles.AllowThousands標志,則s可以出現由provider指定的文化的千位分隔符。 |
| . | 特定于文化的小數點符號。如果style包含NumberStyles.AllowDecimalPoint標志,則s可以出現由provider指定的區域性的小數點符號。 |
| fractional_digits | 小數位數。數字 0 出現一次或多次。僅當style包含NumberStyles.AllowDecimalPoint標志時,小數位才能出現在s中。 |
| e | 'e' 或 'E' 字符,表示該值以指數表示法表示。如果style包含NumberStyles.AllowExponent標志,則s參數可以用指數表示法表示數字。 |
| hexdigits | 從 0 到 f 或 0 到 F 的十六進制數字序列。 |
注:無論style參數的值如何,解析操作都會忽略s中的任何終止 NUL (U+0000) 字符。
只有十進制數字的字符串(對應于NumberStyles.None標志)總是能成功解析。大多數剩余的NumberStyles成員控制元素可能但不是必須出現在此輸入字符串中。下表顯示了各個NumberStyles成員如何影響s中可能存在的元素。
| 非復合 NumberStyles 值 | s 中除數字外允許的元素 |
|---|---|
| NumberStyles.None | 僅限十進制數字。 |
| NumberStyles.AllowDecimalPoint | 小數點 ( . ) 和小數位數元素。但是,小數位數必須僅包含一個或多個 0 數字,否則方法將返回false。 |
| NumberStyles.AllowExponent | s參數也可以使用指數表示法。如果s以指數表示法表示一個數字,則它必須表示Int32數據類型范圍內的整數,且不包含非零的分數分量。 |
| NumberStyles.AllowLeadingWhite | s開頭的ws元素。 |
| NumberStyles.AllowTrailingWhite | s末尾的ws元素。 |
| NumberStyles.AllowLeadingSign | 符號可以出現在數字之前。 |
| NumberStyles.AllowTrailingSign | 符號可以出現在數字之后。 |
| NumberStyles.AllowParentheses | 以括號形式包含數值的符號元素。 |
| NumberStyles.AllowThousands | 千位分隔符 ( , ) 元素。 |
| NumberStyles.AllowCurrencySymbol | $元素。 |
| NumberStyles.Currency | 所有元素。s參數不能表示十六進制數或指數表示法的數字。 |
| NumberStyles.Float | s開頭或結尾的ws元素、s開頭的符號和小數點 ( . ) 符號。s參數也可以使用指數表示法。 |
| NumberStyles.Number | ws、sign、千位分隔符 ( , ) 和小數點 ( . ) 元素。 |
| NumberStyles.Any | 所有樣式,除了s不能表示十六進制數。 |
如果使用NumberStyles.AllowHexSpecifier標志,則s必須是不帶前綴的十六進制值。例如,“C9AF3”解析成功,但“0xC9AF3”解析不成功。style唯一可以出現的其他標志是NumberStyles.AllowLeadingWhite和NumberStyles.AllowTrailingWhite。(NumberStyles枚舉有一個復合樣式NumberStyles.HexNumber,它包括兩個空白標志。)
provider參數是一個IFormatProvider實現,例如CultureInfo對象或NumberFormatInfo對象,其GetFormat方法返回一個NumberFormatInfo對象。NumberFormatInfo對象提供有關s的區域性特定信息的格式。 如果provider是null,則使用當前區域性的NumberFormatInfo對象。
總結
本文通過示例詳細介紹了C# TryParse怎樣轉換小數和16進制數字等字符串。在使用TryParse轉換字符串時,應特別注意其各種參數的合理使用。
相關文章
