1.功能介绍
最近工作的时候遇到了一个统计酒店价格并且转成中文在页面显示的需求,抽空研究了一下,捣鼓出来这么个js,没有灵光一闪的亮点,但好歹能用了
2.算法
1.把传入的字符串切割为数组,长度为1则表示是整数,长度为2则表示还有小数部分;
2.取整数部分,例如 1,234,567,890这个数字,把亿数量级的切割出来当做a,把万数量级的切割出来为b,把个数量级的切割出来为c,那么这个数字被转化的最终结果就是“a亿b万c”了;
3.把a、b、c分别转化成“X千X百X十”的格式,结果:x千x百x十x亿x千x百x十x万x千x百x十x;
4.小数部分转化成x角x分,这个就好做了
3.实现
话不多说 代码如下:
/**
* 把汉字存起来,待会儿数字n的转化就是chineseNumb[n];
*/
let chineseNumb =['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
/**
* 辅助函数,用于把四位的字符串转成中文
* @param str 输入的字符串
* @param isBegin 是否是开头部分,开头部分和中间部分读法都不同 true||false
* @returns {string} 四位字符串
*/
function turnToChinese(str,isBegin){
let result = "";
let numb = parseInt(str);
if (numb === 0) {
result = isBegin?"":"零";
}else if(numb>0 && numb<10){
//一位数 000x
let g = chineseNumb[numb];
result = result + (isBegin?""+g:"零"+g);
}else if (numb>=10 && numb<100) {
//两位数 00xx
let s = chineseNumb[parseInt(numb/10)]+"拾";
let g = (numb%10===0?"":chineseNumb[numb%10]);
result = result +(isBegin?""+s+g:"零"+s+g);
}else if(numb>=100 && numb<1000){
//三位数 0xxx
let b = chineseNumb[parseInt(numb/100)]+"佰";
let s = (parseInt(numb%100/10)===0?"零":chineseNumb[parseInt(numb%100/10)]+"拾");
let g = (numb%10===0?"":chineseNumb[numb%10]);
result = result +(isBegin?""+b+s+g:"零"+b+s+g);
}else{
//四位数 xxxx
let q = chineseNumb[parseInt(numb/1000)]+"仟";
let b = (parseInt(numb%1000/100)===0?"零":chineseNumb[parseInt(numb%1000/100)]+"佰");
let s = (parseInt(numb%100/10)===0?"零":chineseNumb[parseInt(numb%100/10)]+"拾");
let g = (numb%10===0?"":chineseNumb[numb%10]);
result = result +q+b+s+g;
}
return result.replace(/零零/,"零");
}
/**
* 转换接口 传入字符串直接调用
* @param str 需要传入的字符串
* @returns {string} 返回的也是字符串
*/
function priceToChinese(str){
//拆分成两部分,整数部分和小数部分
let numb_array = str.split('.');
//返回的结果
let result = "";
//获取到整数部分
let intPart = numb_array[0];
//整数部分长度
let intPartLength = intPart.length;
//只支持千亿级别的数据
if (intPartLength>13) {
alert("超出最大范围,请使用科学计数法");
}
if (intPartLength>9) {
//亿的部分 n2亿
let n2 = intPart.substring(intPartLength-12,intPartLength-8);
if (parseInt(n2) !== 0) {
result = result + turnToChinese(n2,true)+"亿";
}
//万的部分 n1万
let n1 = intPart.substring(intPartLength-8,intPartLength-4);
if (parseInt(n1) !==0) {
result = result + turnToChinese(n1,false)+"万";
}
//少于一万的部分 n0
let n0 = intPart.substring(intPartLength-4,intPartLength);
result = result + turnToChinese(n0,false);
//当0作为结尾时不需要显示这个“零”
if (result.endsWith("零",result.length)) {
result = result.substring(0,result.length-1);
}
} else if (intPartLength>4) {
//万的部分 n1万
let n1 = intPart.substring(intPartLength-8,intPartLength-4);
if (parseInt(n1) !==0) {
result = result + turnToChinese(n1,true)+"万";
}
//少于一万的部分 n0
let n0 = intPart.substring(intPartLength-4,intPartLength);
result = result + turnToChinese(n0,false);
//当0作为结尾时不需要显示这个“零”
if (result.endsWith("零",result.length)) {
result = result.substring(0,result.length-1);
}
}else if(intPartLength<=4){
//少于一万的部分 n0
let n0 = intPart.substring(intPartLength-4,intPartLength);
result = result + turnToChinese(n0,true);
if (result.endsWith("零",result.length)) {
result = result.substring(0,result.length-1);
}
}
//如果以小数点分割后 只有整数部分||小数部分为0,拼接上 “圆整”,否则还应加上“角分”单位
if (numb_array.length ===1) {
return result+"圆整";
}else{
//获取小数部分 只要前两位,如果只有一位,则补全为两位
let fp = (numb_array[1]+"0").substring(0,2);
let floatPart = parseInt(fp);
if (floatPart === 0) {
return result + "圆整";
}
result = result + "圆";
let j = parseInt(floatPart/10);
result += chineseNumb[j]+"角";
let fen = floatPart%10;
result+=chineseNumb[fen]+"分";
return result;
}
}