c#中的类型转换,int.parse("ab")为什么会出错

一、问题

  

  在一个简单的闰年问题的判断中,输入框获取的字符串,我们希望输入数字字符串,将字符串转换为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,或许可以解决问题。

  修改后的关键代码如下:

  

 1        private void button1_Click(object sender, EventArgs e)
 2         {
 3             String str = textBox1.Text;
 4             String str1 = "";
 5             int num = 0;
 6             bool temp = int.TryParse(str, out num);
 7             if (temp)
 8             {
 9                 if (checkleap(num))
10                     str1 = "输入年份为闰年";
11                 else
12                     str1 = "输入结果不为闰年";
13             }
14             else
15             {
16                 str1 = "输入年份格式不正确";
17             }
18             MessageBox.Show(str1);
19         }

  测试用例:

测试用例 预计输出 实际输出
“1234” 输入结果不为闰年 输入结果不为闰年
“2000” 输入结果为闰年 输入结果为闰年
“1900” 输入结果不为闰年   输入结果不为闰年
“abcd” 输入年份格式不正确 输入年份格式不正确
“” 输入年份格式不正确 输入年份格式不正确

 测试截图:

因此我们在以后的编程中,要注重int.Tryparse()的使用,以及对各种情况的考虑。

时间: 2024-08-09 14:47:14

c#中的类型转换,int.parse("ab")为什么会出错的相关文章

Arduino中数据类型转换 int转换为char 亲测好使,itoa()函数

由于博主最近在做一个项目,需要采集不同传感器的数据,包括float型的HCHO,以及int型的PM2.5数据.但是最终向服务器上传的数据都得转换为char型才能发送,这是借鉴了一个github上面的实例实现了在Arduino上部署socket使之与服务器进行交互. github实例如下: https://github.com/washo4evr/Socket.io-v1.x-Library 在本项目中多次使用了数据类型转换,前文提到了float和double类型转换为char,如下:http:/

C#中(int)、Conver.Toint32()、int.Parse()三种类型转换方式的区别与联系--C#基础知识

自己也是刚学习C#程序设计语言,总结了一点知识点,想分享给大家.毕竟刚学习这门语言,学得不深,哪里如果有错误,请帮个忙指出一下哈,谢谢! 1.(int)可用于单精度.双精度等其他数值类型的转换(到整型int),不能用于转换string类型,例如: 这里用(int)转换string是不可以的,系统会报错,程序是不能运行. using System.Collections.Generic; using System.Linq; using System.Text; using System.Thre

c#中convert.toInt32和int.parse()和强制类型转换的区别

string a="123"; int i=(string)a; 这是会出现错误因为:强制类型转换只能转换值类型不能转换引用类型 string属于引用类型    强制类型转换时如果值类型为小数则直接舍位  如: int i=(int)123.6  结果为:123 int.parse()里边的值只能是string类型,他也只能转换string里边的整数如: string a="123"    string a="123.4"就会出错  也不能转换值

软件测试第四周--关于int.parse()的类型转换问题

先来归纳一下我们用过的所有类型转换方法: 1. 隐式类型转换,即使用(int) 直接进行强制类型转换.这种方法的优点是简单粗暴,直接指定转换类型,没有任何保护措施,所以也很容易抛出异常导致程序崩溃.当我们将int类型转成 long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译 错误. 2.int.Parse()是一种类容转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNu

C#/.NET整数的三种强制类型转换(int)、Convert.ToInt32()、int.Parse()的区别

这三种方式都是强制把内容转换为整数,但他们之间是有区别的,如下: 一.(int)适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型). 二.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型,Parse就是把String类型转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string类型. 三.Convert.ToInt32()适合将Object类型转换为int型:Con

C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别以及ToString()和Convert.ToString()的区别

在计算关于“钱”的各种占比时,我遇到了各种问题. 例如: double a=1.4035; Console.WriteLine($"0.##输出:{a.ToString("0.##")}");   ①Console.WriteLine($"F2输出:{a.ToString("F2")}"); ②Console.WriteLine($"0.00输出:{a.ToString("0.00")}"

C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别

1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3.Convert.ToInt32()适合将Object类型转换为int型; 4.Convert.ToInt32()和int.Parse()的细微差别: 对于空值(null)的处理不 同,Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则 会产生异常

C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法:分别为(int).int.Parse().int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?相信很多童鞋也不能完全说清楚. 下面从被转换对象说起,在我们实际开发项目的过程中,我们碰到需要被转换的类型大概有3大类,分别是空值(NULL).数字类型(包含float,double,int,long等)和字符串(

C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>

作者:Statmoon 出处:http://leolis.cnblogs.com/ 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法:分别为(int).int.Parse().int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?相信很多童鞋也不能完全说清楚. 下面从被转换对象说起,在我们实际开发项目的过程中,我们碰到需要被转换的类型大概有3大类,分别是空值