详解C# TryParse怎样转换小数、16进制、千分位数字等字符串
作者:admin 时间:2022-5-26 23:36:39 浏览:按照我们平时常用的写法,TryParse
是不能转换小数和16进制数字、千分位数字等字符串的,要使用TryParse
也能转换小数和16进制数字等字符串,我们需要另外的写法,当然,还是用TryParse
方法来实现。
示例
我们看看下面的示例和执行结果。(环境: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("转换 <b>" + stringToConvert + "</b> 到 <b>" + number + "</b><br><br>");
else
Response.Write("尝试转换 <b>" + stringToConvert + "</b> 失败" + "<br><br>");
}
}
输出
评论
从执行结果看到,TryParse
成功转换了某些小数,以及16进制数字的字符串。但并不是所有小数都能转换,而对16进制数字字符串的写法也有所要求。下面对此进行详细介绍。
TryParse(String, NumberStyles, IFormatProvider, Int32)
将指定样式和特定区域性格式的数字的字符串表示形式转换为其等效的 32 位有符号整数。返回值指示转换是否成功。
public static bool TryParse (string? s, System.Globalization.NumberStyles style, IFormatProvider? provider, out int result);
参数
s
String:包含要转换的数字的字符串。使用style
指定的样式解释字符串。style
NumberStyles:枚举值的按位组合,指示可以出现在s
中的样式元素。要指定的典型值是Integer
。provider
IFormatProvider:提供有关s
的区域性特定格式信息的对象。result
Int32:当此方法返回时,如果转换成功,则包含与s
中包含的数字等效的 32 位有符号整数值,如果转换失败,则返回零。如果s
参数为null
或空、格式不符合style
或表示小于MinValue或大于MaxValue的数字,则转换失败。此参数未初始化传递;最初提供的任何值result
都将被覆盖。
返回
布尔值:true,如果s
转换成功;否则,false。
例外
style
不是NumberStyles
值。
-或者-
style
不是AllowHexSpecifier
和HexNumber
值的组合。
例子
请看文章开头的示例。
评论
TryParse
方法与Parse
方法类似,只是TryParse
方法在转换失败时不会抛出异常。它消除了s
在无效且无法成功解析的事件中使用异常处理来测试FormatException
的需要。
style
参数定义了参数中允许的样式元素(例如空格或正号或负号)以使s
解析操作成功。它必须是NumberStyles
枚举中位标志的组合。根据style
的值,s
参数可能包括以下元素:
[ws][$][sign][digits,]digits[.fractional_digits][e[sign]digits][ws]
或者,如果style
参数包含AllowHexSpecifier
:
[ws]十六进制数字[ws]
方括号([ 和 ])中的项目是可选的。下表描述了每个元素。
元素 | 描述 |
---|---|
ws | 空格可选。空格可以出现在s 的开头,如果style 包含NumberStyles.AllowLeadingWhites 标志,或者在s 的末尾,如果style 包含NumberStyles.AllowTrailingWhite 标志。 |
$ | 特定于文化的货币符号。它在字符串中的位置由provider 参数的GetFormat 方法返回的NumberFormatInfo 对象的CurrencyPositivePattern 属性定义。如果style 包含NumberStyles.AllowCurrencySymbol 标志,则可以出现货币符号。 |
sign | 可选标志。如果style 包含NumberStyles.AllowLeadingSign 或NumberStyles.AllowTrailingSign 标志,则s 可以出现标志符号。 |
digits | 从 0 到 9 的数字序列。 |
, | 特定于文化的千位分隔符。如果style 包含NumberStyles.AllowThousands 标志,则s 可以出现由provider 指定的文化的千位分隔符。 |
. | 特定于文化的小数点符号。如果style 包含NumberStyles.AllowDecimalPoint 标志,则s 可以出现由provider 指定的区域性的小数点符号。 |
fractional_digits | 小数位数。数字 0 出现一次或多次。仅当style 包含NumberStyles.AllowDecimalPoint 标志时,小数位才能出现在s 中。 |
e | 'e' 或 'E' 字符,表示该值以指数表示法表示。如果style 包含NumberStyles.AllowExponent 标志,则s 参数可以用指数表示法表示数字。 |
hexdigits | 从 0 到 f 或 0 到 F 的十六进制数字序列。 |
注:无论style
参数的值如何,解析操作都会忽略s
中的任何终止 NUL (U+0000) 字符。
只有十进制数字的字符串(对应于NumberStyles.None
标志)总是能成功解析。大多数剩余的NumberStyles
成员控制元素可能但不是必须出现在此输入字符串中。下表显示了各个NumberStyles
成员如何影响s
中可能存在的元素。
非复合 NumberStyles 值 | s 中除数字外允许的元素 |
---|---|
NumberStyles.None | 仅限十进制数字。 |
NumberStyles.AllowDecimalPoint | 小数点 ( . ) 和小数位数元素。但是,小数位数必须仅包含一个或多个 0 数字,否则方法将返回false 。 |
NumberStyles.AllowExponent | s 参数也可以使用指数表示法。如果s 以指数表示法表示一个数字,则它必须表示Int32数据类型范围内的整数,且不包含非零的分数分量。 |
NumberStyles.AllowLeadingWhite | s 开头的ws元素。 |
NumberStyles.AllowTrailingWhite | s 末尾的ws元素。 |
NumberStyles.AllowLeadingSign | 符号可以出现在数字之前。 |
NumberStyles.AllowTrailingSign | 符号可以出现在数字之后。 |
NumberStyles.AllowParentheses | 以括号形式包含数值的符号元素。 |
NumberStyles.AllowThousands | 千位分隔符 ( , ) 元素。 |
NumberStyles.AllowCurrencySymbol | $元素。 |
NumberStyles.Currency | 所有元素。s 参数不能表示十六进制数或指数表示法的数字。 |
NumberStyles.Float | s 开头或结尾的ws元素、s 开头的符号和小数点 ( . ) 符号。s 参数也可以使用指数表示法。 |
NumberStyles.Number | ws、sign、千位分隔符 ( , ) 和小数点 ( . ) 元素。 |
NumberStyles.Any | 所有样式,除了s 不能表示十六进制数。 |
如果使用NumberStyles.AllowHexSpecifier
标志,则s
必须是不带前缀的十六进制值。例如,“C9AF3”解析成功,但“0xC9AF3”解析不成功。style
唯一可以出现的其他标志是NumberStyles.AllowLeadingWhite
和NumberStyles.AllowTrailingWhite
。(NumberStyles
枚举有一个复合样式NumberStyles.HexNumber
,它包括两个空白标志。)
provider
参数是一个IFormatProvider
实现,例如CultureInfo
对象或NumberFormatInfo
对象,其GetFormat
方法返回一个NumberFormatInfo
对象。NumberFormatInfo
对象提供有关s
的区域性特定信息的格式。 如果provider
是null
,则使用当前区域性的NumberFormatInfo
对象。
总结
本文通过示例详细介绍了C# TryParse怎样转换小数和16进制数字等字符串。在使用TryParse转换字符串时,应特别注意其各种参数的合理使用。
相关文章
- 站长推荐