c#中的类型转换,int.parse("ab")为什么会出错
2015-04-07 17:02
495 查看
一、问题
在一个简单的闰年问题的判断中,输入框获取的字符串,我们希望输入数字字符串,将字符串转换为int整数进行判断。编写程序如下
但是当我们输入非法字符时 int.parse("ab")抛出异常。
为什么int.parse("ab")会抛出异常呢?应该怎么处理?
我们接下来先讨论c#中的几种类型转换
二、 几种类型转换方式。
1.(int) 是一种类型转换,当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误
2.int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。
如果字符串为空,则抛出ArgumentNullException异常;
如果字符串内容不是数字,则抛出FormatException异常;
如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;
3、int.TryParse与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。
最后一个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值
4、Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数;
比较:Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。Convert.ToInt32 参数为 "" 时,抛出异常; int.Parse 参数为 "" 时,抛出异常。 Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串
三、问题分析
由于输入字符串ab不是数字因此跑出了“FormatException”。
在类型转换讨论中,我们提到了int.TryParse,或许可以解决问题。
修改后的关键代码如下:
测试用例:
测试截图:
因此我们在以后的编程中,要注重int.Tryparse()的使用,以及对各种情况的考虑。
在一个简单的闰年问题的判断中,输入框获取的字符串,我们希望输入数字字符串,将字符串转换为int整数进行判断。编写程序如下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { } private Boolean checkleap(int year) { bool temp = false; if (year % 4 == 0) { temp = true; } if (year % 100 == 0) { temp = false; } if (year % 400 == 0) { temp = true; } return temp; } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { String str = textBox1.Text; String str1 = ""; if (checkleap(int.Parse(str))) { str1 = "输入年份为闰年"; } else { str1 = "输入结果不为闰年"; } MessageBox.Show(str1); } } }
但是当我们输入非法字符时 int.parse("ab")抛出异常。
为什么int.parse("ab")会抛出异常呢?应该怎么处理?
我们接下来先讨论c#中的几种类型转换
二、 几种类型转换方式。
1.(int) 是一种类型转换,当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误
2.int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。
如果字符串为空,则抛出ArgumentNullException异常;
如果字符串内容不是数字,则抛出FormatException异常;
如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;
3、int.TryParse与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。
最后一个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值
4、Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数;
比较:Convert.ToInt32 参数为 null 时,返回 0; int.Parse 参数为 null 时,抛出异常。Convert.ToInt32 参数为 "" 时,抛出异常; int.Parse 参数为 "" 时,抛出异常。 Convert.ToInt32 可以转换的类型较多; int.Parse 只能转换数字类型的字符串
三、问题分析
由于输入字符串ab不是数字因此跑出了“FormatException”。
在类型转换讨论中,我们提到了int.TryParse,或许可以解决问题。
修改后的关键代码如下:
private void button1_Click(object sender, EventArgs e) { String str = textBox1.Text; String str1 = ""; int num = 0; bool temp = int.TryParse(str, out num); if (temp) { if (checkleap(num)) str1 = "输入年份为闰年"; else str1 = "输入结果不为闰年"; } else { str1 = "输入年份格式不正确"; } MessageBox.Show(str1); }
测试用例:
测试用例 | 预计输出 | 实际输出 |
“1234” | 输入结果不为闰年 | 输入结果不为闰年 |
“2000” | 输入结果为闰年 | 输入结果为闰年 |
“1900” | 输入结果不为闰年 | 输入结果不为闰年 |
“abcd” | 输入年份格式不正确 | 输入年份格式不正确 |
“” | 输入年份格式不正确 | 输入年份格式不正确 |
因此我们在以后的编程中,要注重int.Tryparse()的使用,以及对各种情况的考虑。
相关文章推荐
- C#中(int)、Conver.Toint32()、int.Parse()三种类型转换方式的区别与联系--C#基础知识
- C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别
- C#中(int)、Conver.Toint32()、int.Parse()三种类型转换方式的区别与联系--C#基础知识
- int.parse("abcd")为什么出错,应该怎样避免这个问题
- bc#中(int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- C# int类型显示和隐式转换的比较
- C# 数组类型转换 int[] 转换string[]
- c#中无法将类型“int”隐式转换为“System.IntPtr”
- 存储过程,从数据类型 nvarchar 转换为 int 时出错
- 黑马程序员--c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- 在c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- C# 0、1 状态转换(int 类型转string 类型的方法)
- 无法将类型"int"隐式转换为"string"
- C#中int类型与string类型相互转换
- 从数据类型 int 转换为 nvarchar 时出错。
- 判断C#中的字符串是否是数字,如果是转换成int类型
- C#中 (int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- 在c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32()四种转换的区别
- Int32.TryParse,int.Parse,Convert.ToInt32类型转换比较