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