由于js的弱精度,在计算小数相加时总是会丢失精度,经过测试,即便把小数转化为整数再算,在几十个小数相加时精度依然会丢失,在开发处理的时候只有去后台用BigDecimal计算出来再返回前台,如果大家有更好的方法,欢迎告知。
一、金额转换大写:
//阿拉伯数字转换为大写汉字
function Arabia_To_Chinese(n) {
var unit = "仟佰拾亿仟佰拾万仟佰拾元角分", str = "";
n += "00";
var a = n.indexOf('-');
if(a != -1){
n = n.substring(1);
var indexpoint = n.indexOf('.'); // 如果是小数,截取小数点前面的位数
if (indexpoint >= 0){
n = n.substring(0, indexpoint) + n.substr(indexpoint+1, 2); // 若为小数,截取需要使用的unit单位
}
unit = unit.substr(unit.length - n.length); // 若为整数,截取需要使用的unit单位
for (var i=0; i < n.length; i++){
str += "零壹贰叁肆伍陆柒捌玖".charAt(n.charAt(i)) + unit.charAt(i); //遍历转化为大写的数字
}
return "负数"+str.replace(/零(仟|佰|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万/g, "$1").replace(/^元零?|零分/g, "").replace(/元$/g, "元整").replace(/角$/g, "角整"); // 替换掉数字里面的零字符,得到结果
}else{
var indexpoint = n.indexOf('.'); // 如果是小数,截取小数点前面的位数
if (indexpoint >= 0){
n = n.substring(0, indexpoint) + n.substr(indexpoint+1, 2); // 若为小数,截取需要使用的unit单位
}
unit = unit.substr(unit.length - n.length); // 若为整数,截取需要使用的unit单位
for (var i=0; i < n.length; i++){
str += "零壹贰叁肆伍陆柒捌玖".charAt(n.charAt(i)) + unit.charAt(i); //遍历转化为大写的数字
}
return str.replace(/零(仟|佰|拾|角)/g, "零").replace(/(零)+/g, "零").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万/g, "$1").replace(/^元零?|零分/g, "").replace(/元$/g, "元整").replace(/角$/g, "角整"); // 替换掉数字里面的零字符,得到结果
}
}
演示结果:
- 25987896.33 贰仟伍佰玖拾捌万柒仟捌佰玖拾陆元叁角叁分
- -987896.03 负数玖拾捌万柒仟捌佰玖拾陆元零叁分
- 89632.20 捌万玖仟陆佰叁拾贰元贰角整
二、数字加千分位
//加千分符
function getComma(amountInput){
//判断在非千分符金额框输入的是否是数字
//非数字
if(isNaN(parseFloat(amountInput.value))){
//另千分符金额框为空
$(amountInput).val("");
}else{//是数字,将数字保留两位小数赋给真实金额框
var a = new Number(amountInput.value);//转换为数字类型
var b = a.toFixed(2);//保留两位小数
var c = b.replace(/(\d)(?=(\d{3})+(\.|$))/g, '$1,');//使用正则替换,每隔三个数加一','
amountInput.value = c ;
}
}
三、只能输入金额和小数点:onKeyUp="value=value.replace(/[^\d\.\- ]/g,'')"