|
|
|
|
|
前面文章介紹了single.tryParse將數(shù)字字符串轉(zhuǎn)換為浮點(diǎn)數(shù)的方法,但是如果要顯式定義可以出現(xiàn)在字符串中的元素(例如貨幣符號(hào)、千位分隔符和空格),需要使用TryParse(String, NumberStyles, IFormatProvider, Single)
方法重載,這是本文要介紹的內(nèi)容。
TryParse(String, NumberStyles, IFormatProvider, Single)
將指定樣式和特定區(qū)域性格式的數(shù)字的字符串表示形式轉(zhuǎn)換為其等效的單精度浮點(diǎn)數(shù)。返回值指示轉(zhuǎn)換是成功還是失敗。
public static bool TryParse (string? s, System.Globalization.NumberStyles style, IFormatProvider? provider, out float result);
s
String:包含要轉(zhuǎn)換的數(shù)字的字符串。style
NumberStyles:枚舉值的按位組合,典型值是Float
與AllowThousands
的組合。provider
IFormatProvider:提供有關(guān)s
的區(qū)域性特定格式信息的對(duì)象。result
Single:當(dāng)此方法返回時(shí),如果轉(zhuǎn)換成功,則包含與s
中包含的數(shù)值或符號(hào)等效的單精度浮點(diǎn)數(shù),如果轉(zhuǎn)換失敗,則返回零。如果s
參數(shù)是null或Empty、不符合style
的格式,或者style
不是NumberStyles枚舉常量的有效組合,則轉(zhuǎn)換失敗。如果s
表示小于MinValue或大于MaxValue的數(shù)字,它在 .NET Framework 或 .NET Core 2.2 及更早版本上也會(huì)失敗。此參數(shù)未初始化傳遞;最初提供的任何值result
都將被覆蓋。布爾值:true,如果s
轉(zhuǎn)換成功;否則,false。
style
不是NumberStyles值。
-或者-
style
不是AllowHexSpecifier和HexNumber值的組合。
使用示例
下面的示例演示了使用Single.TryParse(String, NumberStyles, IFormatProvider, Single)
方法來解析具有特定樣式并使用特定區(qū)域性的約定格式化的數(shù)字的字符串表示形式。
string value;
System.Globalization.NumberStyles style;
System.Globalization.CultureInfo culture;
float number;
// Parse currency value using en-GB culture.
value = "£1,097.63";
style = System.Globalization.NumberStyles.Number |
System.Globalization.NumberStyles.AllowCurrencySymbol;
culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
if (Single.TryParse(value, style, culture, out number))
Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
Console.WriteLine("Unable to convert '{0}'.", value);
value = "1345,978";
style = System.Globalization.NumberStyles.AllowDecimalPoint;
culture = System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR");
if (Single.TryParse(value, style, culture, out number))
Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
Console.WriteLine("Unable to convert '{0}'.", value);
value = "1.345,978";
style = System.Globalization.NumberStyles.AllowDecimalPoint |
System.Globalization.NumberStyles.AllowThousands;
culture = System.Globalization.CultureInfo.CreateSpecificCulture("es-ES");
if (Single.TryParse(value, style, culture, out number))
Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
Console.WriteLine("Unable to convert '{0}'.", value);
value = "1 345,978";
if (Single.TryParse(value, style, culture, out number))
Console.WriteLine("Converted '{0}' to {1}.", value, number);
else
Console.WriteLine("Unable to convert '{0}'.", value);
// The example displays the following output:
// Converted '£1,097.63' to 1097.63.
// Converted '1345,978' to 1345.978.
// Converted '1.345,978' to 1345.978.
// Unable to convert '1 345,978'.
在 .NET Core 3.0 及更高版本中,太大而無法表示的值會(huì)按照 IEEE 754 規(guī)范的要求四舍五入為PositiveInfinity
或NegativeInfinity
。在包括 .NET Framework 在內(nèi)的早期版本中,解析太大而無法表示的值會(huì)導(dǎo)致失敗。
此重載與Parse(String, NumberStyles, IFormatProvider)
方法的不同之處在于返回一個(gè)布爾值,該值指示解析操作是否成功,而不是返回解析后的數(shù)值。它消除了在s
無效且無法成功解析的事件中使用異常處理來測試FormatException的需要。
style
參數(shù)定義了s
參數(shù)解析操作成功的允許格式。它必須是NumberStyles枚舉中位標(biāo)志的組合。不支持以下NumberStyles成員:
對(duì)provider
指示的區(qū)域性,s
參數(shù)可以包含PositiveInfinitySymbol
、NegativeInfinitySymbol
、NaNSymbol
。此外,根據(jù)style
的值,s
參數(shù)可能包括以下元素:
[ws] [$] [sign][integral-digits,]integral-digits[.fractional-digits][e[sign]exponential-digits][ws]
方括號(hào)([ 和 ])中的元素是可選的。下表描述了每個(gè)元素。
元素 | 描述 |
---|---|
ws | 可選的空白。如果style 包含NumberStyles.AllowLeadingWhite 標(biāo)志,則可以在s 開頭出現(xiàn)空格。如果style 包含NumberStyles.AllowTrailingWhite 標(biāo)志,它可以出現(xiàn)在s 末尾。 |
$ | 特定于文化的貨幣符號(hào)。它在字符串中的位置由provider 參數(shù)的IFormatProvider.GetFormat 方法返回的NumberFormatInfo 對(duì)象的NumberFormatInfo.CurrencyNegativePattern 或NumberFormatInfo.CurrencyPositivePattern 屬性定義。如果style 包含NumberStyles.AllowCurrencySymbol 標(biāo)志,則可以出現(xiàn)貨幣符號(hào)。 |
sign | 可選標(biāo)志。如果style 包含NumberStyles.AllowLeadingSign 標(biāo)志,標(biāo)志可以出現(xiàn)在s 開頭,如果style 包含NumberStyles.AllowTrailingSign 標(biāo)志,它可以出現(xiàn)在s 結(jié)尾。如果包含NumberStyles.AllowParentheses 標(biāo)志,括號(hào)可以用在s中表示負(fù)值。 |
integral-digits | 一系列從 0 到 9 的數(shù)字,用于指定數(shù)字的整數(shù)部分。如果有小數(shù)位,則可以不存在整數(shù)位。 |
, | 特定于文化的千位分隔符。如果style 包含NumberStyles.AllowThousands 標(biāo)志,則s 可以出現(xiàn)當(dāng)前區(qū)域性的千位分隔符。 |
. | 特定于文化的小數(shù)點(diǎn)符號(hào)。如果style 包含NumberStyles.AllowDecimalPoint 標(biāo)志,則s 可以出現(xiàn)當(dāng)前區(qū)域性的小數(shù)點(diǎn)符號(hào)。 |
fractional-digits | 一系列從 0 到 9 的數(shù)字,用于指定數(shù)字的小數(shù)部分。如果style 包含NumberStyles.AllowDecimalPoint 標(biāo)志,則s 可以出現(xiàn)小數(shù)位數(shù)。 |
e | e 或 E 字符,表示s 可以使用指數(shù)表示法表示數(shù)字。如果 style 包含NumberStyles.AllowExponent 標(biāo)志,則s 參數(shù)可以用指數(shù)表示法表示數(shù)字。 |
exponential-digits | 一系列從 0 到 9 的數(shù)字,用于指定指數(shù)。 |
注:無論style
參數(shù)的值如何,解析操作都會(huì)忽略s
中的任何終止 NUL (U+0000) 字符。
僅包含數(shù)字的字符串(對(duì)應(yīng)于NumberStyles.None
樣式)如果在Single
類型的范圍內(nèi),則始終會(huì)成功解析。剩余的System.Globalization.NumberStyles
成員控制元素可能但不是必須出現(xiàn)在輸入字符串中。下表顯示了各個(gè)NumberStyles
標(biāo)志如何影響s
可能存在的元素。
NumberStyles 值 | s 中除數(shù)字外允許的元素 |
---|---|
None | 僅限整數(shù)位元素。 |
AllowDecimalPoint | 點(diǎn)(. )和小數(shù)元素。 |
AllowExponent | s 參數(shù)也可以使用指數(shù)表示法。該標(biāo)志本身支持整數(shù)數(shù)字E指數(shù)數(shù)字形式的值;需要附加標(biāo)志才能成功解析具有正號(hào)或負(fù)號(hào)和小數(shù)點(diǎn)符號(hào)等元素的指數(shù)符號(hào)的字符串。 |
AllowLeadingWhite | s 開頭的ws(空白符)元素。 |
AllowTrailingWhite | s 末尾的ws(空白符)元素。 |
AllowLeadingSign | s 開頭的符號(hào)元素。 |
AllowTrailingSign | s 末尾的符號(hào)元素。 |
AllowParentheses | 以括號(hào)形式包含數(shù)值的符號(hào)元素。 |
AllowThousands | , 元素。 |
AllowCurrencySymbol | $ 元素。 |
Currency | 全部。s 參數(shù)不能表示十六進(jìn)制數(shù)或指數(shù)表示法的數(shù)字。 |
Float | ws元素在的s 開頭或結(jié)尾,符號(hào)在s 的開頭,以及. 符號(hào)。s 參數(shù)也可以使用指數(shù)表示法。 |
Number | , ,ws ,sign ,千位分隔符 (, )和小數(shù)點(diǎn) ( . ) 元素。 |
Any | 所有樣式,除了s 不能表示十六進(jìn)制數(shù)。 |
provider
參數(shù)是一個(gè)IFormatProvider
實(shí)現(xiàn),其GetFormat
方法返回一個(gè)NumberFormatInfo
對(duì)象,該對(duì)象提供特定于區(qū)域性的格式信息。當(dāng)調(diào)用TryParse(String, NumberStyles, IFormatProvider, Single)
方法時(shí),它會(huì)調(diào)用provider
參數(shù)的GetFormat
方法并向其傳遞一個(gè)表示NumberFormatInfo
類型的Type
對(duì)象。GetFormat
方法然后返回NumberFormatInfo
對(duì)象,該對(duì)象提供有關(guān)參數(shù)格式的信息。sprovider
有三種使用方法為解析操作提供自定義格式信息的參數(shù):
CultureInfo
對(duì)象,該對(duì)象表示提供格式信息的區(qū)域性。它的GetFormat
方法返回提供該區(qū)域性的數(shù)字格式信息的NumberFormatInfo
對(duì)象。NumberFormatInfo
對(duì)象。(它的GetFormat
實(shí)現(xiàn)只是返回自身。)IFormatProvider
的自定義對(duì)象。它的GetFormat
方法實(shí)例化并返回提供格式信息的NumberFormatInfo
對(duì)象。如果provider
是null,則s
根據(jù)當(dāng)前區(qū)域性的NumberFormatInfo
對(duì)象解釋null的格式。
如果s
超出Single
數(shù)據(jù)類型的范圍,則該方法會(huì)在 .NET Framework 和 .NET Core 2.2 及更早版本上引發(fā)OverflowException 。在 .NET Core 3.0 及更高版本上,如果s
小于Single.MinValue
則返回Single.NegativeInfinity
,如果s
大于Single.MaxValue
則返回Single.PositiveInfinity
。
如果在解析操作過程中在s
參數(shù)中遇到分隔符,并且適用的貨幣或數(shù)字小數(shù)和組分隔符相同,則解析操作假定分隔符是小數(shù)分隔符而不是組分隔符。有關(guān)分隔符的詳細(xì)信息,請(qǐng)參閱CurrencyDecimalSeparator
、NumberDecimalSeparator
、CurrencyGroupSeparator
和NumberGroupSeparator
。
總結(jié)
本文通過具體示例詳細(xì)介紹了TryParse(String, NumberStyles, IFormatProvider, Single)的用法,通過本文的學(xué)習(xí),我們應(yīng)該了解到如何將指定樣式和特定區(qū)域性格式的數(shù)字的字符串表示形式轉(zhuǎn)換為其等效的單精度浮點(diǎn)數(shù)。
參考文章