如何把string解析为int?

博客围绕如何把string解析为int展开,介绍了Convert.ToInt32、Int32.Parse、Int32.TryParse三种简单方法及其区别。还说明了非十进制、科学记数法表示的string解析方法,以及处理待解析string里空格的方式,同时指出解析时可能出现的异常情况。
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方法待解析的字符串可能前缀或后缀的空格、前缀正负号、(十进制)小数点、科学记数法指数表示等。
在C#中,`string` 类型可以通过多种方式转换为 `int` 类型。以下是几种常见的方法及其适用场景: 1. **使用 `int.Parse()` 方法** 当确定字符串内容是一个有效的整数表示形式时,可以直接使用 `int.Parse()` 进行转换。如果输入的字符串不符合预期格式,则会抛出异常。例如: ```csharp string str = "123"; int number = int.Parse(str); // 将字符串 "123" 转换为整数 123[^2] ``` 2. **使用 `Convert.ToInt32()` 方法** 此方法同样适用于将字符串转换为整数的情况。它与 `int.Parse()` 功能相似,但在处理某些特殊情况下可能表现不同(如处理空值)。例如: ```csharp string str = "456"; int number = Convert.ToInt32(str); // 将字符串 "456" 转换为整数 456[^1] ``` 3. **使用 `int.TryParse()` 方法** 如果无法确定字符串是否能够被成功解析为整数,推荐使用 `TryParse` 方法。这种方法不会引发异常,而是通过返回布尔值来表明转换是否成功,并将结果存储到输出参数中。例如: ```csharp string str = "789"; int result; bool success = int.TryParse(str, out result); if (success) { Console.WriteLine($"转换成功,结果为: {result}"); // 输出:转换成功,结果为: 789[^2] } else { Console.WriteLine("转换失败"); } ``` 以上三种方法各有优劣,在实际开发过程中可以根据具体需求选择合适的方式。 ### 注意事项 - 使用 `int.Parse()` 和 `Convert.ToInt32()` 需要确保输入数据的有效性,否则可能会触发运行时错误。 - 对于不确定的数据源,优先考虑使用 `int.TryParse()` 来提高程序健壮性和用户体验。 ```csharp // 示例代码展示 TryParse 的安全性 string invalidStr = "abc"; if (!int.TryParse(invalidStr, out _)) { Console.WriteLine("输入不是一个有效整数!"); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值