引言
首先,明确概念,数字也是字符的一种。字符类型,特别是NVarchar类型强大到可以直接或者间接的转换成任一类型(前提转换内容准确,毕竟不可能把字母‘a‘转换成‘1111’)。
主要关键词
截取字符串主要使用关键词substring()
substring() 方法返回一个字符串在开始索引到结束索引之间的一
个子集, 或从开始索引直到字符串的末尾的一个子集
连接字符串可以使用 “+”、StringBuilder.Append和String.Format。
其中string是引用类型,保留在堆上,用的时候传的是内存中的地址,每次修改就会重新创建一个新的string对象来存储字符串,原有的会被自动回收。StringBuilder.Append和String.Format本质但是使用StringBuilder可变字符序列
StringBuilder str = new StringBuilder("123");
str.Append("abc");
string str= String.Format("{0}{1}{2}","a","b","c");
貌似在后面的C#版本和VS2015以上,可以使用$代替string.format();
四舍五入
Math.round( a, n ); | n决定保留位数 |
---|---|
a.ToString(“fn”); | n决定保留位数 |
String.Format(“{0:Nn}”,a); | n决定保留位数 |
a.ToString(“#0.000”); | n决定保留位数 |
Decimal.Round(a,n) ; | n决定保留位数 |
这里要注:因为大部分软件内核封装时候是按照四舍五入进行封装的,所以常用的函数也都是四舍五入的
非四舍五入
要想非四舍五入常常要使用字符截取,常用的就是对时间进行字符截取保留到年月日
mode.CU_wcrq = ds1.Tables[0].Rows[0]["LastOperateTime"].ToString().Substring(0, 8);
上面这种只适合于位数确定的数字,如果数字变化就不再适用了。这时候可以取巧,使用除法/的取余数,即保留n位数就增大10 的n次方再除以10 的n次方
double test3 = Math.Truncate(test2 * 100) / 100;
Math封装的几种函数
在.net中具有封装了Math的四种函数,即Math.Round向下舍入,Math.Ceiling向上舍入,Math.Truncate向下舍入为零。 因此,对于正数,Math.Truncate类似于Math.Floor,对于负数,类似于Math.Ceiling。
注意:使用上面的函数获得的结果并不一定是你所期望的
以Math.Truncate为例,我们先使用字符串test1获取Quantity的数值,再将字符串强转换成double类型,注意上面的数字,test1是2126.43000000,强转换把后面零去除得test2的值2126.43,保留两位小数,但是Math.Truncate向下取舍即第三位小数在0~4区间百分位小数进行减一操作,在5到9区间百分位保留原值。所以为了获取我们期望的值往往进行判断,在非四舍五入下保留期望位数。
注意:在double类型下的加减将更加精确,小数位数更多,不在是简单的加减法。
扩展
除了调用方法之外,我们还可以自己写保留位数方法
public static String calculateProfit(double doubleValue) {
// 保留4位小数,非四舍五入
DecimalFormat df = new DecimalFormat("0.0000");
String result = df.format(doubleValue);
// 获取小数 . 号第一次出现的位置
int inde = firstIndexOf(result, ".");
// 字符串截断
return result.substring(0, inde + 3);
}
public static String formatDouble(String value) {
DecimalFormat df = new DecimalFormat("#0.00");
String st=df.format(Double.valueOf(value)); //四舍五入
return st;
}