数字转换为大写金额

3,052 阅读3分钟

将数字转换为大写金额是一种常见的操作,尤其在财务和合同文件中,确保金额表达的准确性和正式性非常重要。

引言

中国计数单位

万是10的4次方;万以下是10进制;万以上为万进制。

  1. 个、十、百、千、万;
  2. 十万、百万、千万、亿;亿是10的8次方。
  3. 10亿、100亿、1000亿、兆;兆是10的12次方。
  4. 10兆、100兆、1000兆、京;京是10的16次方。
  5. 10京、100京、1000京、垓;垓是10的20次方。
  6. 10垓、100垓、1000垓、秭;秭是10的24次方。
  7. 10秭、100秭、1000秭、穰;穰是10的28次方。
  8. 10穰、100穰、1000穰、沟;沟是10的32次方。
  9. 10沟、100沟、1000沟、涧;涧是10的36次方。
  10. 10涧、100涧、1000涧、正;正是10的40次方。
  11. 10正、100正、1000正、载;载是10的44次方。
  12. 10载、100载、1000载、极;极是10的48次方。
  • 等……

构成规则

  • 0到9:零、壹、贰、叁、肆、伍、陆、柒、捌、玖
  • 整数右至左:个位、十位、百位、千位、万位、亿位等
  • 小数左至右:角, 分, 毫, 厘
  • 特殊情况:连续的零只需写一个“零”

步骤

  1. 限制金额的数值
  2. 金额分割成整数部分和数部分
  3. 整部分转换成大写金额
  4. 小数部分转换成大写金额
  5. 整数部分和小数部分的大写金额合并

整数部分

  • 整数部分从右至左每四位一组,分别为个位、万位、亿位等,并补充对应的万、亿等单位
  • 对每一组四位数,逐位转换成大写数字,并加上对应的十、百、千等单位
  • 去除连续的零,对于连续的零,只保留一个零
  • 当某组四位数中的四位都是零,则不加上对应的单位

小数部分

逐位将数字转换为大写,后跟对应单位。如:5873->伍角捌分柒毫叁厘

js范例

export function numberToCurrency(money) {
  //构成规则
  var cnNums = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
  var cnIntRadice = new Array("", "拾", "佰", "仟");
  var cnIntUnits = new Array("", "万", "亿", "兆");
  var cnDecUnits = new Array("角", "分", "毫", "厘");
  var cnInteger = "整";
  var cnIntLast = "元";

  // 数据拆分,限制逻辑
  var maxNum = 999999999999999.9999; //最大处理的数字
  var IntegerNum; //金额整数部分
  var DecimalNum; //金额小数部分
  var ChineseStr = ""; //中文金额字符串
  var parts; //分离金额后用的数组,预定义
  // 异常处理
  if (money == "" || isNaN(money)) {
      return "非数字或空";
  }
  money = parseFloat(money);
  if (money >= maxNum) {
      return "超出最大处理数字";
  }
  if (money == 0) {
      ChineseStr = cnNums[0] + cnIntLast + cnInteger;
      return ChineseStr;
  }
  // 拆分小数、整数
  money = money.toString();
  if (money.indexOf(".") == -1) {
      IntegerNum = money;
      DecimalNum = '';
  } else {
      parts = money.split(".");
      IntegerNum = parts[0];
      DecimalNum = parts[1].substr(0, 4);
  }

  // 整型部分转换 /////////////////////////////////////
  if (parseInt(IntegerNum, 10) > 0) {
      var zeroCount = 0;
      var IntLen = IntegerNum.length;
      for (var i = 0; i < IntLen; i++) {
          var n = IntegerNum.substr(i, 1);
          var p = IntLen - i - 1;
          var q = p / 4;
          var 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 != '') {
      var decLen = DecimalNum.length;
      for (var i = 0; i < decLen; i++) {
          var n = DecimalNum.substr(i, 1);
          if (n != '0') {
              ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
          }
      }
  }

  //特殊处理,空或小数空时处理
  if (ChineseStr == '') {
      ChineseStr += cnNums[0] + cnIntLast + cnInteger;
  } else if (DecimalNum == '') {
      ChineseStr += cnInteger;
  }

  return ChineseStr;
}

html 界面部分

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.m-input {
				width: 400px;
				height: 30px;
			}

			.m-button {
				width: 80px;
				height: 30px;
			}

			#mOutDiv {
				font-size: 20px;
				line-height: 40px;
				color: #666;
			}
		</style>
	</head>
	<body>
		<form>
			金额: <input id="mInput" class="m-input" type="number" name="FirstName" value="">
			<input id="mSubmit" class="m-button" type="submit" value="转换"><br>
			<div id="mOutDiv"></div>
		</form>
	</body>
	<script>
		var mInput = document.getElementById('mInput');
		var mSubmit = document.getElementById('mSubmit');
		var mOutDiv = document.getElementById('mOutDiv');

		mSubmit.addEventListener('click', function(event) {
			event.preventDefault();
			mOutDiv.innerHTML = numberToCurrency(mInput.value);
		})

		function numberToCurrency(money) {
            ...
        }
	</script>
</html>