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

2021-03-11 23:31

阅读:1241

标签:说明   报错   输入   成功   要求   不为   datetime   null   保留   

    在计算关于“钱”的各种占比时,我遇到了各种问题。

例如:

double a=1.4035;

 

Console.WriteLine($"0.##输出:{a.ToString("0.##")}");      ①
Console.WriteLine($"F2输出:{a.ToString("F2")}");      ②
Console.WriteLine($"0.00输出:{a.ToString("0.00")}");      ③

结果:①输出1.4    ②输出1.40    ③输出1.40。

  卧*,见鬼了。怎么回事。后来查询后才知道ToString("0.##")并不是我们想的小数点后两位,而是  # 代表后面的不是零就被保留,如果是0就去掉。 例如ToString("0.##") 1.20的话结果是1.2。

    比如有这种需求的:如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2530.可不可以刚好保留到最后一位不是0的位置。默认保留2位,如果真的有3位小数,就保留3位,有4位就保留4位。

    可以这么干,默认有两位就是00 其它的如果大于两位就不是零就保留的话 可以下面这样写
double dd = 1.2530;
string ret = dd.ToString("0.00####");      

   好这个大概就这样了。想知道更具体的可以去问一下百度,(#^.^#)。

 

一、一般用法说明

  ToString()是Object的扩展方法,所以都有ToString()方法;而Convert.ToString(param)(其中param参数的数据类型可以是各种基本数据类型,也可以是bool或object类对象。

二、ToString()和Convert.ToString()的区别

  一般情况下,这两种方法都可以通用,但是当返回的数据类型中有可能出现null值时如果调用ToString方法了,就会返回NullReferenceException,除非你要捕捉此异常再做处理,否则在这种情况下就应考虑使用Convert.ToString()方法了,因为Convert.ToString(null)不会抛出异常而是返回空字符串。
主要的区别就如上所示,由于ToString()是扩展方法,扩展自Object,所以转null报异常。而Convert.ToString()返回空字符串。

string str1 = "";

Console.WriteLine(Convert.ToString(str1) == null); //false

Console.WriteLine(Convert.ToString(str1) == "");  //true

 
string str2 = null;
Console.WriteLine(Convert.ToString(str2) == null); //true
Console.WriteLine(Convert.ToString(str2) == "");  //false

null转了之后还是null,""转了之后还是""。

从 object 到 string 大致有四种方式,包括显式转换和as关键词的使用:obj.ToString()、Convert.ToString()、(string)obj、obj as string。他们都能将 object 对象转换成 string 对象。

  前两个方法通常是由别的对象得到 string 对象,它们间的区别如前文所述主要表现在:

ToString() :如果 obj 为 null,调用 obj.ToString() 方法会导致 NullReferenceException 异常。

Convert.ToString():如果 obj 为 null,调用 Convert.ToString()会返回null

(string):用强制转换 (string)obj 要求 obj 的运行时类型必须是 string。如果不是,就会抛出异常。

as :用 as 方法则会相对平稳,当 obj 的运行时类型不是 string 时会返回 null 而不抛出异常。

  所以在通常在我们需要得到某个对象的 string 表达形式时,我们应该使用 ToString() 和 Convert.ToString(),这时候你就得根据情形选一个,假如你能保证你的对象不为 null,则两个差不多。如果有可能为 null,你就应该用 Convert.ToString(),如果你希望它为 null 的时候抛出异常,那么当然可以选择 ToString()。

  ToString()这个方法太方便了,以致于以为就它这一种方法, 一般都是转之前先判断是否为null。

 

(int)、int.Parse()、int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?资料有很多,我就不再多说了,直接来点“干货”——总结

首先,在 C# 中,int 其实就是 System.Int32,即都是32位的。 
其次,(int) 和 Convert.ToInt32 是两个不同的概念,前者是类型转换,而后者则是内容转换,它们并不总是等效的。我们很清楚 C# 提供类型检查,你不能把一个 string 强制转换成 int,隐式转换就更加不可能,例如如下的代码就行不通了: 
string text = "1412"; 
int id = (int)text; 
因为 string 和 int 是两个完全不同并且互不兼容的类型。说到这里,你可能会问什么才算是兼容的呢?其实,能够使用 (int) 进行强类型转换的只能是数值类型了,例如 long、short、double等,不过进行这种转换时你需要考虑精度问题。

 

(int)          类型转换

Convert.ToInt32()    内容转换(内容解释)

int.Parse()       转换String为int

int.TryParse()       尝试转换(int.TryParse(input, out i)如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值)

(1)Convert.ToInt32的参数比较多,Int.Parse只能转换string类型的.

(2)Parse就是把String转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string.

(3)Convert可以提供多种类型的转换,也就搜索是Convert.*()括号中可以为很多种类型(包括string).

 

1)对于转换对象,Convert.ToInt32()可以为多种类型(例出数字类型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字符串类型(即各种整型ToString()之后的形式,不能为浮点型,否则int.Parse()就会出现输入的字符串格式不正确的错误,int.TryParse()也会返回false,输出参数为0),(int)只能是数字类型(例float,int,uint等);

2)对于空值NULL,从运行报错的角度讲,(int)强制转换和int.Parse()都不能接受NULL;Convert.ToInt32()其实是在转换前先做了一个判断,参数如果为NULL,则直接返回0,否则就调用int.Parse()进行转换,int.TryParse()其实是对int.Parse()做了一个异常处理,如果出现异常则返回false,并且将输出参数返回0;

3)针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,但是也是进行取舍了的,Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d还是返回1;

4)关于溢出,将大的数据类型转换为小的数据类型时Convert.ToInt32()和int.Parse()都会报溢出错误,值对于Int32太大或太小。而(int)不报错,但是返回值为-1。

我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,如果是整型字符串类型的,考虑用int.Parse()进行转换,如果不是这两种类型,再考虑用Convert.ToInt32()进行转换。

 

最后要感谢Statmoon、Walle2014。他们的解释比我的更清楚,我把他们的“砖”搬我这点用用,技术图片

 

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

标签:说明   报错   输入   成功   要求   不为   datetime   null   保留   

原文地址:https://www.cnblogs.com/bkyqtr/p/12612187.html


评论


亲,登录后才可以留言!