JS实现金额千分位化(十六)

爱一个人是一回事,拥有一个人是另外一回事,爱上并拥有一个人,更是另外一回事。 蝴蝶,是什么,是希望,是真正的希望。
上一章简单介绍了JS计算字符串的字节数(十五),如果没有看过,请观看上一章

一.金额千分位化

在前端展示,尤其是关于财务系统时,通常要把金额千分位处理,如1234567.234 需要转换成 1,234,567.23 。
这样的解决思路是:

  1. 数字有正负之分, 要把符号位单独拿出来。
  2. 将数字按照整数位和小数位分别进行处理, 整数位是倒着排序,隔3位加上个,
  3. 将数字通过parseFloat() 方法转换成小数,进行有效位数二位的处理。
  4. 需要将字符串转换成相应的数组形式。

二.转换

如传入的参数为: 12345678.234 的形式。

function number(num){
	var noNegative = true; //默认是正值。
	var s=(num + "").replace(/[^\d\.-]/g, ""); //把数字和. 换成空格,也就是前面均加上""
	//此时,转换后的值为 12345678.234   数字与数字之间, .之间,均有"" 
	s=parseFloat(s).toFixed(2); //先转换成小数,后四舍五入两位小数,为12345678.23
	s=s+""; //转换成字符串
	if(parseFloat(s) < 0){ //是负数
		s = Math.abs(s).toFixed(2) + "";  //先转换成正数,然后取两位小数
		noNegative = false; //标志位为负数
	}
	var zheng=s.split(".")[0]; //取出前面的整数值。 为12345678
	var zhengArr=zheng.split("").reverse(); //先按照""进行拆分,后进行反转。
	// 拆分时,为1,2,3,4,5,6,7,8  反转后为8,7,6,5,4,3,2,1
	var dian=s.split(".")[1]; //取出小数部分,为23
	var t="";
	for(var i=0;i<zhengArr.length;i++){
		if(i%3==2&&i!=zhengArr.length-1){ //为第三位,并且并不是最后了。如123456时,6并不加,
			t+=zhengArr[i]+",";
		}else{
			t+=zhengArr[i]+""; //加上空格
		}
	}
	//此时,t的值为876,543,21, 反转后为12,345,678 
	//进行拼接, 符号位+ 反转后的数字+小数点+小数部分
	var value= (noNegative?"":"-")+t.split("").reverse().join("")
	+"."+dian;
	// 输出的值,就是12,345,678.23  
}

写成相应的方法为: formatMoney

var formatMoney=function(s){
	var noNegative = true;
	s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(2) + "";
	if(parseFloat(s) < 0){
		s = Math.abs(s).toFixed(2) + "";
		noNegative = false;
	}
	
	var l = s.split(".")[0].split("").reverse(),
		r = s.split(".")[1];
	t = "";
	for(i = 0; i < l.length; i++) {
		if(i%3==2&&i!=l.length-1){
			t+=l[i]+",";
		}else{
			t+=l[i]+""; //加上空格
		}
	}
	return (noNegative?"":"-") + t.split("").reverse().join("") + "." + r;
}

三. 普通简单的方式,利用数组转换

var formatMoney=function(s){
	var noNegative = true; //默认是正值。
	s=parseFloat(s+"").toFixed(2); //先转换成小数,后四舍五入两位小数,为12345678.23
	s=s+""; //转换成字符串
	if(parseFloat(s) < 0){ //是负数
		s = Math.abs(s).toFixed(2) + "";  //先转换成正数,然后取两位小数
		noNegative = false; //标志位为负数
	}
	var zheng=s.split(".")[0]; //取出前面的整数值。 为12345678。
	var dian=s.split(".")[1]; //取出小数部分,为23
	//将整数部分,利用字符串的charAt() 方法,转换成数组。
	var zhengArr=[];
	for(var i=0;i<zheng.length;i++){
		zhengArr.push(zheng.charAt(i)); //放入的值为 1,2,3,4,5,6,7,8
	}
	zhengArr=zhengArr.reverse(); //反转后为8,7,6,5,4,3,2,1
	var t="";
	for(var i=0;i<zhengArr.length;i++){
		if(i%3==2&&i!=zhengArr.length-1){ //为第三位,并且并不是最后了。如123456时,6并不加,
			t+=zhengArr[i]+",";
		}else{
			t+=zhengArr[i]+""; //加上空格
		}
	}
	//此时,t的值为876,543,21, 反转后为12,345,678 
	return (noNegative?"":"-")+t.split("").reverse().join("")
	+"."+dian;
}

去除相应的注释之后为:

var formatMoney=function(s){
	var noNegative = true; //默认是正值。
	s=parseFloat(s+"").toFixed(2); 
	s=s+""; //转换成字符串
	if(parseFloat(s) < 0){ //是负数
		s = Math.abs(s).toFixed(2) + "";  
		noNegative = false; 
	}
	var zheng=s.split(".")[0]; 
	var dian=s.split(".")[1]; 
	//将整数部分,利用字符串的charAt() 方法,转换成数组。
	var zhengArr=[];
	for(var i=0;i<zheng.length;i++){
		zhengArr.push(zheng.charAt(i));
	}
	zhengArr=zhengArr.reverse();
	var t="";
	for(var i=0;i<zhengArr.length;i++){
		if(i%3==2&&i!=zhengArr.length-1){ //为第三位,并且并不是最后了。如123456时,6并不加,
			t+=zhengArr[i]+",";
		}else{
			t+=zhengArr[i]+""; //加上空格
		}
	}
	return (noNegative?"":"-")+t.split("").reverse().join("")
	+"."+dian;
}

谢谢!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值