将数字转换为大写金额是一种常见的操作,尤其在财务和合同文件中,确保金额表达的准确性和正式性非常重要。
引言
中国计数单位
万是10的4次方;万以下是10进制;万以上为万进制。
- 个、十、百、千、万;
- 十万、百万、千万、亿;亿是10的8次方。
- 10亿、100亿、1000亿、兆;兆是10的12次方。
- 10兆、100兆、1000兆、京;京是10的16次方。
- 10京、100京、1000京、垓;垓是10的20次方。
- 10垓、100垓、1000垓、秭;秭是10的24次方。
- 10秭、100秭、1000秭、穰;穰是10的28次方。
- 10穰、100穰、1000穰、沟;沟是10的32次方。
- 10沟、100沟、1000沟、涧;涧是10的36次方。
- 10涧、100涧、1000涧、正;正是10的40次方。
- 10正、100正、1000正、载;载是10的44次方。
- 10载、100载、1000载、极;极是10的48次方。
- 等……
构成规则
- 0到9:零、壹、贰、叁、肆、伍、陆、柒、捌、玖
- 整数右至左:个位、十位、百位、千位、万位、亿位等
- 小数左至右:角, 分, 毫, 厘
- 特殊情况:连续的零只需写一个“零”
步骤
- 限制金额的数值
- 金额分割成整数部分和数部分
- 整部分转换成大写金额
- 小数部分转换成大写金额
- 整数部分和小数部分的大写金额合并
整数部分
- 整数部分从右至左每四位一组,分别为个位、万位、亿位等,并补充对应的万、亿等单位
- 对每一组四位数,逐位转换成大写数字,并加上对应的十、百、千等单位
- 去除连续的零,对于连续的零,只保留一个零
- 当某组四位数中的四位都是零,则不加上对应的单位
小数部分
逐位将数字转换为大写,后跟对应单位。如: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>