详解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);
参数
sString:包含要转换的数字的字符串。styleNumberStyles:枚举值的按位组合,典型值是Float与AllowThousands的组合。providerIFormatProvider:提供有关s的区域性特定格式信息的对象。resultSingle:当此方法返回时,如果转换成功,则包含与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)的用法,通过本文的学习,我们应该了解到如何将指定样式和特定区域性格式的数字的字符串表示形式转换为其等效的单精度浮点数。
参考文章



