1.将金额转换成大写
//n为传入的金额
digitUppercase = (n)=> {
let fraction = ['角', '分'];
let digit = [
'零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖'
];
let unit = [
['元', '万', '亿'],
['', '拾', '佰', '仟']
];
let IsNum = Number(n);
if (!isNaN(IsNum)) {
let head = n < 0 ? '欠' : '';
n = Math.abs(n);
let s = '';
for (let i = 0; i < fraction.length; i++) {
//这里可能存在精度缺失问题
s += (digit[Math.floor(n * 100/10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
n = Math.floor(n);
for (let i = 0; i < unit[0].length && n > 0; i++) {
let p = '';
for (let j = 0; j < unit[1].length && n > 0; j++) {
p = digit[n % 10] + unit[1][j] + p;
n = Math.floor(n / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return head + s.replace(/(零.)*零元/, '元')
.replace(/(零.)+/g, '零')
.replace(/^整$/, '零元整');
}else { return "";}
};
digitUppercase(11.5);=>壹拾壹元伍角
2.将金额转换成英文
sepStringM=new Array("", "Thousand ", "Million ", "Billion ", "Trillion ", " ", " ");
nbrStringA=new Array(" ", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ");
nbrStringB=new Array("Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen ");
nbrStringC=new Array(" ", "Twenty ", "Thirty ", "Fourty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety ");
formatNbr=(src, num, sep, per, mode)=>{
let nbr;
let cnt;
let tmp
let int, dec;
switch (typeof(src)){
case "string":nbr=src;break;
case "number":nbr=src.toString();break;
default:break;
}
int=nbr.split(".")[0];
dec=typeof(nbr.split(".")[1])=="undefined"?0:nbr.split(".")[1];
cnt=Math.floor((int.length-1)/3);
for (let i=cnt;i>0;i--){
int=int.substring(int.length-i*3,0)+sep+int.substring(int.length-i*3,int.length);
}
if (num>0) {
if (dec.length>=num) {
switch (mode) {
case "R":
dec=(Math.round(parseInt(dec)/Math.pow(10, (dec.length-num)))).toString().split(".")[0];
break;
case "C":
dec=(Math.ceil(parseInt(dec)/Math.pow(10, (dec.length-num)))).toString().split(".")[0];
break;
default:
dec=dec.substring(0,num);
break;
}
} else {
tmp=num-dec.length;
for (let i=0;i<tmp;i++){
dec=dec+"0";
}
}
return int+per+dec;
} else {return int;}
}
nbrToEngWord=(src, sep, per, mode)=>{
let int=src.split(per)[0];
let dec=src.split(per)[1]=="undefined"?"00":src.split(per)[1];
let str="";
let tmp=int.split(sep);
for (let i=0;i<tmp.length;i++){
if (tmp[i].length==1){//一位数
str=str+this.nbrStringA[parseInt(tmp[i])]+this.sepStringM[tmp.length-i-1];
} else {
if (tmp[i].length==2){//二位数
if (tmp[i].substring(0,1)=="1"){//代表10-20的数
str=str+this.nbrStringB[parseInt(tmp[i].substring(1,2))]+this.sepStringM[tmp.length-i-1];
} else {//代表20-100的数
str=str+this.nbrStringC[parseInt(tmp[i].substring(0,1))-1]+this.nbrStringA[parseInt(tmp[i].substring(1,2))]+this.sepStringM[tmp.length-i-1];
}
} else {//代表
if (tmp[i].substring(0,1)=="0") {
//
} else {
str=str+this.nbrStringA[parseInt(tmp[i].substring(0,1))]+"Hundred ";
}
if (tmp[i].substring(1,2)=="1"){
str=str+this.nbrStringB[parseInt(tmp[i].substring(2,3))]+this.sepStringM[tmp.length-i-1];
} else {
if (tmp[i].substring(1,2)=="0"){
str=str+this.nbrStringA[parseInt(tmp[i].substring(2,3))]+this.sepStringM[tmp.length-i-1];
} else {
str=str+this.nbrStringC[parseInt(tmp[i].substring(1,2))-1]+this.nbrStringA[parseInt(tmp[i].substring(2,3))]+this.sepStringM[tmp.length-i-1];
}
}
}
}
}
dec=(dec.length>2)?dec.substring(0,2):dec;
if (dec.length==1) {dec=dec+"0";}
if (dec=="00") {
str=str+"yuan"
} else {
if(dec.substring(0,1)==="0"){
str=str+"yuan "+"And "+ "zero jiao"+this.nbrStringA[parseInt(dec.substring(1,2))]+"cents";
}else if(dec.substring(1,2)==="0"){
str=str+"yuan "+"And "+this.nbrStringA[parseInt(dec.substring(0,1))]+"jiao";
}else{
str=str+"yuan "+"And "+this.nbrStringA[parseInt(dec.substring(0,1))]+"jiao "+this.nbrStringA[parseInt(dec.substring(1,2))]+"cents";
}
}
//如果最后一个字符串是And则删除
let arr = str.trim().split(" ");
if (arr[arr.length - 1] === "And") {
arr.pop();
}
str = arr.join(" ");
switch (mode){
case "U":str=str.toUpperCase();break;
case "L":str=str.toLowerCase();break;
default:break;
}
return str;
}
//调用的时候
let money = 111.3
let a=this.formatNbr(money , 3, "," , ".","R")
this.nbrToEngWord(a,",",".","L")
//结果:one hundred eleven yuan and three jiao