js和ts两种 将 小写金额转中文大写汉字,阿拉伯数字金额格式化成中文大写汉字,数字金额转换成财务发票大写中文

通过 npm i money2cn 安装  支持typescript 

使用:

import  money2cn  from 'money2cn'
const nums = money2cn(23423423.234)

或者复制源码到项目中 js版 

changeMoneyToCN(money) {
		var cnNums = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); //汉字的数字
		var cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
		var cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
		var cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
		var cnIntLast = "元"; //整型完以后的单位
		var maxNum = 999999999999999.99; //最大处理的数字
		var IntegerNum; //金额整数部分
		var DecimalNum; //金额小数部分
		var ChineseStr = ""; //输出的中文金额字符串
		var parts; //分离金额后用的数组,预定义
		var zeroCount, IntLen, n, p, q, m, decLen;
		if (money == "") {
			return "";
		}
		money = parseFloat(money);
		if (money >= maxNum) {
			$.alert('超出最大处理数字');
			return "";
		}
		if (money == 0) {
			ChineseStr = cnNums[0] + cnIntLast
			return ChineseStr;
		}
		money = money.toString(); //转换为字符串
		if (money.indexOf(".") == -1) {
			IntegerNum = money;
			DecimalNum = '';
			cnIntLast = "元整";
		} else {
			parts = money.split(".");
			IntegerNum = parts[0];
			DecimalNum = parts[1].substr(0, 2);
		}
		if (parseInt(IntegerNum, 10) > 0) { //获取整型部分转换
			zeroCount = 0;
			IntLen = IntegerNum.length;
			for (let i = 0; i < IntLen; i++) {
				n = IntegerNum.substr(i, 1);
				p = IntLen - i - 1;
				q = p / 4;
				m = p % 4;
				if (n == "0") {
					zeroCount++;
				} else {
					if (zeroCount > 0) {
						ChineseStr += cnNums[0];
					}
					zeroCount = 0; //归零
					ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
				}
				if (m == 0 && zeroCount < 4) {
					ChineseStr += cnIntUnits[q];
				}
			}
			ChineseStr += cnIntLast;
			//整型部分处理完毕
		}
		if (DecimalNum != '') { //小数部分
			decLen = DecimalNum.length;
			for (let i = 0; i < decLen; i++) {
				n = DecimalNum.substr(i, 1);
				if (n != '0') {
					ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
				}
			}
		}
		if (ChineseStr == '') {
			ChineseStr += cnNums[0] + cnIntLast;
		}
		return ChineseStr;

	},

ts版

// src/index.ts
export default function(money: number) {
  let cnNums = new Array(
    "零",
    "壹",
    "贰",
    "叁",
    "肆",
    "伍",
    "陆",
    "柒",
    "捌",
    "玖"
  ); //汉字的数字
  let cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
  let cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
  let cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
  let cnIntLast = "元"; //整型完以后的单位
  let maxNum = 999999999999999.99; //最大处理的数字
  let IntegerNum: string = ""; //金额整数部分
  let DecimalNum: string = ""; //金额小数部分
  let ChineseStr = ""; //输出的中文金额字符串
  let parts: string[] = ["", ""]; //分离金额后用的数组,预定义
  let zeroCount, IntLen, n, p, q, m, decLen;
  if (money == undefined) {
    return "";
  }
  if (money >= maxNum) {
    return "超出最大处理数字";
  }
  if (money == 0) {
    ChineseStr = cnNums[0] + cnIntLast;
    return ChineseStr;
  }
  if (money.toString().indexOf(".") == -1) {
    IntegerNum = money.toString();
    DecimalNum = "";
    cnIntLast = "元整";
  } else {
    parts = money.toString().split(".");
    IntegerNum = parts[0];
    DecimalNum = parts[1].substr(0, 2);
  }
  if (parseInt(IntegerNum, 10) > 0) {
    //获取整型部分转换
    zeroCount = 0;
    IntLen = IntegerNum.length;
    for (let i = 0; i < IntLen; i++) {
      n = IntegerNum.substr(i, 1);
      p = IntLen - i - 1;
      q = p / 4;
      m = p % 4;
      if (n == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          ChineseStr += cnNums[0];
        }
        zeroCount = 0; //归零
        ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
      }
      if (m == 0 && zeroCount < 4) {
        ChineseStr += cnIntUnits[q];
      }
    }
    ChineseStr += cnIntLast;
    //整型部分处理完毕
  }
  if (DecimalNum != "") {
    //小数部分
    decLen = DecimalNum.length;
    for (let i = 0; i < decLen; i++) {
      n = DecimalNum.substr(i, 1);
      if (n != "0") {
        ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
      }
    }
  }
  if (ChineseStr == "") {
    ChineseStr += cnNums[0] + cnIntLast;
  }
  return ChineseStr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值