6.1隐式类型转换
要求等号两边参与运算的操作数的类型必须一致,如果不一致,满足下列条件会发生自动类型转换,或者称之为隐式类型转换。
要求:两种类型兼容,目标类型大于原类型
例如:int和double兼容(都是数字类型)
例如:double>int(小的转大的)
6.2显示类型转换
两种类型相兼容int-->double
大的转成小的double-->int
语法:
目标类型 变量名 = (目标类型)原数值
显式类型转换示例:
static void Main(string[] args)
{
double d = 5673.74;
int i;
// 强制转换 double 为 int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
输出结果:
5673
缺点:丢失精度,丢失数据
6.3强制类型转换
隐式类型转换和显示类型转换,都属于不安全的的类型转换,因为会出现数据丢失。所以C#中提供了两种方法:Parse方法、Convert方法。
6.3.1 Parse方法
Parse方法用于将字符串类型转换成任意基本类型,这里要求等号左、右两边的数据类型兼容,Parse作用是将字符串转换为对应的数据类型。
注意:
① 如果字符串内容为空或者null时,则抛出ArgumentNullException异常。
② 如果字符串内容不是数字,则抛出FormatException异常。
③ 如果字符串内容所表示数字超出指定的数据类型可表示的范围,则抛出OverflowException异常。
方法 |
说明 |
int.Parse(string value) |
字符串类型转换成整数类型(int) |
char.Parse(string value) |
字符串类型转换成字符类型(char) |
double.Parse(string value) |
字符串类型转换成双精度浮点类型(double) |
Single.Parse(string value) |
字符串类型转换成单精度浮点类型(float) |
int i = int.Parse(“111”);
i++;
Console.WriteLine(i);
输出结果:112
6.3.2 TryParse方法
TryParse方法也是将数字内容的字符串转为int类型,但是该方式比int.Parse优越的地方,就是它不会出现异常。
如果转换成功返回 true,如果转换失败返回 false。
很明显,最后一个参数为输出值,如果转换失败,输出值为 0;如果转换成功,则输出相应的值。
语法:int.TryParse(string s, out int result)
代码示例:
Console.Write("请输入int类型的整数:");
int result = 0;
bool b = int.TryParse(Console.ReadLine(),out result);
if(b)
{
Console.WriteLine($"您输入的数字为{result}");
}
else
{
Console.WriteLine("输入错误!");
}
6.3.3 Convert方法
如果两个变量的类型相兼容,可以使用自动类型转换或者强制类型转换,但是,如果两个类型的变量不兼容,比如string和int,这时候我们可以使用一个叫做Convert的转换工厂进行转换。
Convert方法是数据类型转换中最灵活的方法,它能够将任意数据类型的值转换成任意数据类型,前提是不要超出指定数据类型的范围。
注意:
① 使用Convert进行转换,也要满足一个条件:“面上要过得去”。
比如:string a= "123"/ 可以转成int或double
string b= "123abc"/ 不可以转成int或double
② 浮点数转换为int型数据后进行了四舍五入的计算。
③ 该方式不能用来处理char类型,否则会报异常。
C# 提供了下列内置的类型转换方法
方法 |
说明 |
Convert.ToInt32() |
转换为整数类型(int) |
Convert.ToChar() |
转换为字符型(char) |
Convert.ToDouble() |
转换为双精度浮点型(double) |
Convert.ToSingle() |
转换为单精度浮点型(float) |
Convert.ToString() |
转换为字符串类型(string) |
Convert.ToDateTime() |
转换为日期类型(datetime) |
把不同值的类型转换为字符串类型的代码实例
static void Main(string[] args)
{
int i = 75;
float f = 53.005f;
double d = 2345.7652;
bool b = true;
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());
Console.ReadKey();
}
输出结果:
75
53.005
2345.7652
True
6.3.4类型转换练习
交换变量练习
方法1:使用临时变量
将输入的字符串转化为int值 两种方法:①int.Parse(string s)和②Convert.ToInt32(string value)。定义一个临时变量temp,将x的值赋给temp,然后将y的值赋给x,然后将temp存放的x的值赋给y;(可以这样理解:相当与一个空杯子、一杯咖啡,一杯牛奶,将牛奶和咖啡交换)
Console.WriteLine("请输入两个整数x,y");
//使用 int.parse(string s) 将输入的字符串为int值
int x = int.Parse(Console.ReadLine());
//使用Convert.ToInt32(string value)将输入的字符串转化为int值
int y = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("x={0},y={1}", x, y);
int temp;//定义一个临时变量temp
temp = x; //将x的值赋给temp
x = y; //将y的值赋给x
y = temp; //将temp存放的x的值赋给y
Console.WriteLine("x={0},y={1}",x,y);
COnsole.ReadKey();
方法2:使用加减法
将x+y的和的值赋给x(y的值不变)。x减去于原先y的值即为x的值,将这个得到的x的值赋给y。然后x减去上一步得到的y的值(实际上是原先x的值),就得到现在x的值(原先y的值)。
Console.WriteLine("输入两个整数x,y");
int x = int.Parse(Console.ReadLine());
int y = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("x={0},y={1}", x, y);
x = x + y; //将x+y的和的值赋给x
y = x - y; //这个x-y等于x和y的和减去原先y的值剩余原先x的值
x = x - y; //这个x-y等于x+y的和减去y的值(y在上一步已经变成原先x的值),剩余原先的y的值
Console.WriteLine("x={0},y={1}", x, y);
COnsole.ReadKey();
秒数转换器练习
提示用户输入一串数字,将这串数字转换为天时分秒
Console.WriteLine("请输入要计算的秒数:");
string inputSec = Console.ReadLine();
int seconds = Convert.ToInt32(inputSec);
//先转换有多少整数天,不足一天的转换有多少整数小时,不足一小时的转换有多少分钟,不足一分钟的剩余多少秒
int day = seconds / 86400;//天数
int hour = (seconds % 86400) / 3600;//秒数
int mins = (seconds % 86400) % 3600;//分钟
int min = mins / 60;//分钟
int sec = mins % 60;//秒数
Console.WriteLine($"计算后是{day}天:{hour}小时:{min}分钟:{sec}秒");
COnsole.ReadKey();
判断是否为闰年
两个条件:
1)年份能够被400整除:世纪闰年2000
2)年份能够被4整除但是不能够被100整除:普通闰年2004
Console.WriteLine("请输入年份,我来帮你判断是否为闰年");
int year = Convert.ToInt32(Console.ReadLine());
bool isRun = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
Console.WriteLine(isRun);
//逻辑或的优先级是低于逻辑与的优先级的
Console.ReadKey();