在计算关于“钱”的各种占比时,我遇到了各种问题。
例如:
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()进行转换。