详解C# TryParse(String, NumberStyles, IFormatProvider, Single)转换字符串为浮点数
作者:admin 时间:2022-5-27 11:2:37 浏览:前面文章介绍了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成员:
- NumberStyles.AllowHexSpecifier
- NumberStyles.HexNumber
对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)的用法,通过本文的学习,我们应该了解到如何将指定样式和特定区域性格式的数字的字符串表示形式转换为其等效的单精度浮点数。
参考文章
- 站长推荐