专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » stringint:如何把string解析为int? »正文

stringint:如何把string解析为int?

来源: 发布时间:星期五, 2009年1月9日 浏览:27次 评论:0
  Q:如何把解析为

  A:简单思路方法有 3种:

source = "1412";
result = 0;
  
// 使用Convert.ToInt32( value);
result = Convert.ToInt32(source);
  
// 使用Int32.Parse( value);
result = Int32.Parse(source);
  
// 使用Int32.TryParse( s, out result);
Int32.TryParse(source, out result);


  Q:这 3种思路方法有什么区别?

  A:个简单回答是:

  如果解析失败Int32.Parse(source)总会抛出异常;Convert.ToInt32(source)在source为null情况下不会抛出异常而是简单返回0给方;而Int32.TryParse(source, result)则无论如何都不抛出异常只会返回true或false来介绍说明解析是否成功如果解析失败方将会得到0值

  Q:如果我要解析字面数值不是十进制那么从这些思路方法中得到返回值是有问题有什么思路方法解决?

  A:那么你就需要这些思路方法对应重载版本了个简单思路方法是使用Convert类

public ToInt32( value, fromBase);

  其中fromBase值只能为2、8、10或者16用于指定进制方式如果fromBase不是指定数值或者value不为十进制而又带有前缀正负号就会抛出ArgumentException

   source = "0x1412"; // 这里0x(或0X)前缀是可选

   result = Convert.ToInt32(source, 16);

  当然你还可以通过为Int32类

public Parse( s, NumberStyles style);

  指定NumberStyles.AllowHexSpecier或者NumberStyles.HexNumber为第 2个参数来解析十 6进制字面值此时你需要引用.Globalization命名空间

  或者使用Int32类

public bool TryParse( s, NumberStyles style, IFormatProvider provider, out result);

  并指定NumberStyles.AllowHexSpecier或者NumberStyles.HexNumber为第 2个参数null为第 3个参数来解析十 6进制字面值你当然也应该引用.Globalization命名空间

  这里有点要提醒无论使用Parse或者TryParse思路方法来解析十 6进制串都不能出现0x或0X前缀否则将会抛出异常

  Q:如果我要把使用科学记数法表示转换为又该如何呢?

  A:你可以通过把NumberStyles.AllowDecimalPo | NumberStyles.AllowExponent(把两个NunberStyles枚举进行位运算其中前者介绍说明可能存在小数点而后者则介绍说明可能存在科学记数法指数符号)作为第 2个参数传递给Int32类

public Parse( s, NumberStyles style);

  或者

public bool TryParse( s, NumberStyles style, IFormatProvider provider, out result);

  如果解析出来结果和不兼容就要考虑把结果储存在别类型了例如"1.412e2"就应该把解析结果存放到float或者double或者decimal类型变量里当然你也应该使用和储存变量相对应类型思路方法来解析:

double result = Double.Parse("1.412e2", NumberStyles.AllowDecimalPo | NumberStyles.AllowExponent);

  整个串表达式应该没有任何任何空格否则将有可能抛出异常

  科学记数法格式为[{+|-}]m.dddddd{e|E}[{+|-}]xx可以分解为以下几种形式:

[-]m.dddddde+xx
[-]m.dddddde-xx
[-]m.ddddddE+xx
[-]m.ddddddE-xx
下面列举些不能正常解析:

"1.412 e3"
"1.412E 3"
"1.412e +3"
"141200E- 2"


  Q:如何处理待解析里所包含空格?

  A:对于前缀或后缀空格你同样有多种选择般情况下你可以直接使用String类

public Trim;

  来取掉头尾可能包含空格:

result = Int32.Parse(textBox1.Text.Trim);

  又或者你使用NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite来告诉Parse或TryParse待解析头尾可能包含着空格

result = Int32.Parse(textBox1.Text, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);

  如果待解析串使用科学记数法来表示那么你可以

result = Int32.Parse(" 1.412e3 ", NumberStyles.Float);

  其中NumberStyles.Float告诉Parse思路方法待解析串可能前缀或后缀空格、前缀正负号、(十进制)小数点、科学记数法指数表示等

  Q:如何处理货币解析?

  A:你可以通过指定NumberStyles.Currency来告诉Parse或TryParse待解析串是货币样式NumberStyles.Currency介绍说明待解析串可能包含前缀或后缀空格、前缀正负号、十进制小数点、千分位符号、字面数值可能为整数或小数等:

result = Int32.Parse(" $1,412 ", NumberStyles.Currency);

  但货币样式串不能带有任何十 6进制符号另外货币样式串格式相关设定以Region and Languages Options(区域和语言选项)里面设定为基准



  Q:那么Display leading zeros(零起始显示)、List separator(列表分隔符)、Measurement system(度量衡系统)这 3项在哪里有对应设置呢?

  A:很抱歉到目前为止我也找不到对应地方来设置如果你或者其他人找到了请务必告诉我(不过你可以通过RegionInfo.IsMetric这个只读属性来检测当前系统是否使用Metric(公制)度量系统)

  Q:如果我无法推断待解析串应该使用哪个或多个NumberStyles枚举呢?

  A:这种情况般不会发生待解析串肯定是有或用途这些目或用途就是串字面样式约束而NumberStyles枚举作用就是介绍说明这种约束当然如果你目前确实无法推断那么你可以使用NumberStyles.Any枚举

  Q:在具体编码过程中我如何知道应该选择哪种思路方法来解析串呢?

  A:就我个人来说我会:

  首先你得清楚你所使用CLR版本是否提供某种思路方法支持例如TryParse是.NET 2.0或以上才支持

  其次你可以通过思路方法重载签名来选择如果你要解析非十进制Convert.ToInt32可能是你唯选择除了十进制和十 6进制你可以用它来解析 2进制、 8进制但你不能用Int32.Parse或Int32.TryParse来解释这些进制当然如果是十进制或者十 6进制就哪种思路方法都可以

  另外如果你需要使用NumberStyles枚举来告知相关思路方法待解析样式那么Convert.ToInt32就帮不了你了此时你应该选择Int32.Parse或者Int32.TryParse相应重载

  再次如果你不希望在你代码里处理异常那么Int32.TryParse可能是你唯选择你可能根据它返回至来判断解析是否成功进而决定是否使用解析结果但如果你希望透过异常机制通知方解析失败那么Int32.Parse或者Convert.ToInt32都是不错选择

  最后选择准则不可能唯或者通用你可能会在实战整理总结出适合你自己选择准则如果你有更好选择思路方法请你也告诉我

  Q:在.NET里面如果要将解析为其它基元类型(Primitive Type)是否也有类似思路方法?

  A:是在.NET里面我们为这些基元类型提供了Convert.ToPrimitiveType、PrimitiveType.Parse、PrimitiveType.TryParse(.NET 2.0或以上)思路方法用于把解析成对应基元类型当然你得首先保证待解析字面值和对应基元类型兼容这些基元类型是(括号中是对应C#关键字):SByte (s), Byte (), Int16 (), UInt16 (u), Int32 (), UInt32 (u), Int64 (long) , UInt64 (ulong), Char (char), Single (float), Double (double) , Boolean (bool), Decimal (decimal)另外.NET也提供了把解析为DateTime结构思路方法除了有上面提到 3种形式(Convert.ToDateTime、DateTime.Parse、DateTime.TryParse)的外我们还可以使用DateTime.TryParseExact所有这些思路方法都是大同小异差别在于对串字面值格式(包括其所包含符号)规定有兴趣你可以参考以下MSDN文档或者其他专题资料

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: