详解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);
参数
sString:包含要转换的数字的字符串。使用style指定的样式解释字符串。styleNumberStyles:枚举值的按位组合,指示可以出现在s中的样式元素。要指定的典型值是Integer。providerIFormatProvider:提供有关s的区域性特定格式信息的对象。resultInt32:当此方法返回时,如果转换成功,则包含与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转换字符串时,应特别注意其各种参数的合理使用。
相关文章



