金额数字转换成大写,英文。111,壹佰壹拾壹元整,one hundred and eleven yuan

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下SQL函数将金额数字转换为大写: ```sql CREATE FUNCTION dbo.ConvertToWords (@NumValue DECIMAL(19, 2)) RETURNS NVARCHAR(4000) AS BEGIN DECLARE @WholePart BIGINT DECLARE @FractionalPart INT DECLARE @Words NVARCHAR(4000) SELECT @WholePart = CONVERT(BIGINT, FLOOR(@NumValue)) SELECT @FractionalPart = CONVERT(INT, (@NumValue - @WholePart) * 100) -- Whole part conversion SELECT @Words = dbo.ConvertNumber(@WholePart) + ' dollars ' -- Fractional part conversion IF @FractionalPart > 0 BEGIN SELECT @Words = @Words + 'and ' + dbo.ConvertNumber(@FractionalPart) + ' cents' END RETURN @Words END GO CREATE FUNCTION dbo.ConvertNumber (@Number BIGINT) RETURNS NVARCHAR(4000) AS BEGIN DECLARE @Units TABLE (UnitName NVARCHAR(10)) DECLARE @Tens TABLE (TenName NVARCHAR(10)) DECLARE @Teens TABLE (TeenName NVARCHAR(10)) INSERT INTO @Units VALUES ('Zero'), ('One'), ('Two'), ('Three'), ('Four'), ('Five'), ('Six'), ('Seven'), ('Eight'), ('Nine') INSERT INTO @Tens VALUES ('Ten'), ('Twenty'), ('Thirty'), ('Forty'), ('Fifty'), ('Sixty'), ('Seventy'), ('Eighty'), ('Ninety') INSERT INTO @Teens VALUES ('Eleven'), ('Twelve'), ('Thirteen'), ('Fourteen'), ('Fifteen'), ('Sixteen'), ('Seventeen'), ('Eighteen'), ('Nineteen') DECLARE @Words NVARCHAR(4000) IF @Number >= 1000000000 BEGIN SELECT @Words = dbo.ConvertNumber(@Number / 1000000000) + ' billion ' SELECT @Number = @Number % 1000000000 END IF @Number >= 1000000 BEGIN SELECT @Words = @Words + dbo.ConvertNumber(@Number / 1000000) + ' million ' SELECT @Number = @Number % 1000000 END IF @Number >= 1000 BEGIN SELECT @Words = @Words + dbo.ConvertNumber(@Number / 1000) + ' thousand ' SELECT @Number = @Number % 1000 END IF @Number >= 100 BEGIN SELECT @Words = @Words + dbo.ConvertNumber(@Number / 100) + ' hundred ' SELECT @Number = @Number % 100 END IF @Number >= 20 BEGIN SELECT @Words = @Words + (SELECT TenName FROM @Tens WHERE (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) = (@Number / 10)) + ' ' SELECT @Number = @Number % 10 END IF @Number > 10 AND @Number < 20 BEGIN SELECT @Words = @Words + (SELECT TeenName FROM @Teens WHERE (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) = (@Number - 10)) + ' ' SELECT @Number = 0 END IF @Number > 0 BEGIN SELECT @Words = @Words + (SELECT UnitName FROM @Units WHERE (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) = @Number) + ' ' END RETURN RTRIM(@Words) END GO ``` 要使用这个函数,你可以像这样调用它: ```sql SELECT dbo.ConvertToWords(12345.67) AS AmountInWords ``` 该函数将返回 "Twelve thousand three hundred forty-five dollars and sixty-seven cents"。 请注意,此示例仅处理最多十亿美元的金额。如果需要处理更大的金额,请根据需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值