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