String to Int 的细节

Q :如何把 string 解析为 int
A :简单的方法有三种:
string  source = "1412";
int  result = 0;

//  使用 Convert.ToInt32(string value);
result = Convert.ToInt32(source);

//  使用 Int32.Parse(string value);
result = Int32.Parse(source);

//  使用 Int32.TryParse(string s, out int result);
Int32.TryParse(source,  out  result);
Q :这三种方法有什么不同?
A :一个简单的回答是:
如果解析失败, Int32.Parse(source) 总会抛出异常; Convert.ToInt32(source) source null 的情况下不会抛出异常而是简单的返回 0 给调用方;而 Int32.TryParse(source, result) 则无论如何都不抛出异常,只会返回 true false 来说明解析是否成功,如果解析失败,调用方将会得到 0 值。
Q :如果我要解析的字符串的字面数值不是十进制的话,那么从这些方法中得到的返回值是有问题的。有什么方法解决?
A :那么你就需要这些方法的对应重载版本了,一个简单的方法是使用 Convert 类的
public   static   int  ToInt32( string  value,  int  fromBase);
其中 fromBase 的值只能为 2 8 10 或者 16 ,用于指定进制方式。如果 fromBase 不是指定的数值或者 value 不为十进制而又带有前缀正负号,就会抛出 ArgumentException
string  source = "0x1412";  //  这里的 0x (或 0X )前缀是可选的。
int  result = Convert.ToInt32(source, 16);
当然,你还可以通过为 Int32 类的
public   static   int  Parse( string  s, NumberStyles style);
指定 NumberStyles.AllowHexSpecifier 或者 NumberStyles.HexNumber 为第二个参数来解析十六进制字面值的字符串,此时,你需要引用 System.Globalization 命名空间。
或者使用 Int32 类的
public   static   bool  TryParse( string  s, NumberStyles style, IFormatProvider provider,  out   int  result);
并指定 NumberStyles.AllowHexSpecifier 或者 NumberStyles.HexNumber 为第二个参数, null 为第三个参数来解析十六进制字面值的字符串。你当然也应该引用 System.Globalization 命名空间。
这里有一点要提醒的是,无论使用 Parse 或者 TryParse 方法来解析十六进制,字符串都不能出现 0x 0X 前缀,否则将会抛出异常。
Q :如果我要把使用科学记数法表示的 string 转换为 int 又该如何呢?
A :你可以通过把 NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent (把两个 NunberStyles 枚举进行位运算,其中前者说明可能存在小数点,而后者则说明可能存在科学记数法的指数符号)作为第二个参数传递给 Int32 类的
public   static   int  Parse( string  s, NumberStyles style);
或者
public   static   bool  TryParse( string  s, NumberStyles style, IFormatProvider provider,  out   int  result);
如果解析出来的结果与 int 不兼容的,就要考虑把结果储存在别的类型了。例如 "1.412e2" 就应该把解析结果存放到 float 或者 double 或者 decimal 类型的变量里,当然,你也应该使用与储存变量相对应的类型的方法来解析:
double  result = Double.Parse("1.412e2", NumberStyles.AllowDecimalPoint | 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 :如何处理待解析 string 里所包含的空格?
A :对于字符串的前缀或后缀空格,你同样有多种选择,一般情况下,你可以直接使用 String 类的
public   string  Trim();
来取掉头尾可能包含的空格:
int  result = Int32.Parse(textBox1.Text.Trim());
又或者,你使用 NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite 来告诉 Parse TryParse 待解析字符串的头尾可能包含着空格。
int  result = Int32.Parse(textBox1.Text, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);
如果待解析的字符串使用科学记数法来表示,那么你可以
int  result = Int32.Parse(" 1.412e3 ", NumberStyles.Float);
其中 NumberStyles.Float 告诉 Parse 方法待解析的字符串可能前缀或后缀的空格、前缀正负号、(十进制)小数点、科学记数法指数表示等。
Q :如何处理货币字符串的解析?
A :你可以通过指定 NumberStyles.Currency 来告诉 Parse TryParse 待解析的字符串是货币样式的。 NumberStyles.Currency 说明待解析字符串可能包含前缀或后缀空格、前缀正负号、十进制小数点、千分位符号、字面数值可能为整数或小数等:
int  result = Int32.Parse(" $1,412 ", NumberStyles.Currency);
货币样式字符串不能带有任何十六进制符号。另外,货币样式字符串格式的相关设定以 Region and Languages Options (区域与语言选项)里面的设定为基准。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值