数字字符串转换为人民币
思路:
- 首先将整数和小数分开。
- 发现规律:
0001 => 壹,0011=》拾壹,0021=》贰拾壹,0300=》叁佰,0301=》叁佰零一
00010000 => 壹万,00110000=》拾壹万,00210000=》贰拾壹万,03000000=》叁佰万,03010000=》叁佰零一万
- 通过规律发现可以以4个数字为一组 然后再判断加上 万,亿,万亿,亿亿,万亿亿,亿亿亿等
先看小数字
小数比较简单
let numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");
function float2rmb(float = "") {
// 分割数值 获得角和分的值
const [jiao, fen] = float.split("");
let arr = [];
// 判断是否需要 X角
if (parseInt(jiao) > 0) {
arr.push(numSup[jiao] + "角");
}
// 判断是否需要 X分
if (parseInt(fen) > 0) {
arr.push(numSup[fen] + "分");
}
return arr.join("");
}
float2rmb("21"); // 壹角贰分
float2rmb("01"); // 壹分
整数部分
先前的思路 四个位为一组进行转换再加上万等单位,代码进行实现:
const bits = ["", "万"]; // ["亿", "万亿"] ["亿亿", "万亿亿"]
const numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");
function int2rmb(int = "") {
let bit = 0;
let rmbArr = [];
while (int) {
const str = int.slice(-4);
int = int.slice(0, -4);
let bit2rmb = int2rmbBite(str);
if (bit2rmb) { // 当有四位对应有值时添加单位 0001_0000_0000 => 壹亿元
// ["", "万"] ["亿", "万亿"] ["亿亿", "万亿亿"]
let bitstr = bits [bit % 2] + (new Array(Math.floor(bit / 2)).fill("亿")).join("");
bit2rmb += bitstr;
rmbArr.push(bit2rmb);
}
bit++;
}
const rmbStr = rmbArr.join("").replace(/^零*/, ""); // 去掉头部的 零
return rmbStr ? rmbStr + "元" : "";
}
// 四个为一组的进行转换 str.length必须为4位
function int2rmbBite(str) {
if (str.length < 4) {
str = new Array(4 - str.length).fill("0").join("") + str;
}
let bit = str.length - 1;
const a = [];
while (bit >= 0) {
let item = parseInt(str[bit]);
switch (bit) {
case 3:
a.unshift(numSup[item]);
break;
case 2:
a.unshift(numSup[item], "拾");
if (item === 1) a.shift(); // 10 有两种情况 拾 或者 壹拾
if (item === 0) a.splice(1, 1);
break;
case 1:
a.unshift(numSup[item], "佰");
if (item === 0) a.splice(1, 1);
break;
case 0 :
a.unshift(numSup[item], "仟");
if (item === 0) a.splice(1, 1);
}
bit--;
}
// 正则将连续的零转为一个零,之后再去掉末尾的 零
return a.join("").replace(/零{1,3}/g, "零").replace(/零$/, "");
}
全部代码
在合并的时候判断是否有角分值,没有的话后边加个整字。
const bits = ["", "万"]; // ["亿", "万亿"] ["亿亿", "万亿亿"]
const numSup = "零壹贰叁肆伍陆柒捌玖拾".split("");
function number2rmb(numstr) {
numstr = String(numstr);
let [int, float] = numstr.split(".");
int = int2rmb(int);
float = float2rmb(float) || "整";
return int + float;
}
function int2rmb(int = "") {
let bit = 0;
let rmbArr = [];
while (int) {
const str = int.slice(-4);
int = int.slice(0, -4);
let bit2rmb = int2rmbBite(str);
if (bit2rmb) { // 当有四位对应有值时添加单位 0001_0000_0000 => 壹亿元
// ["", "万"] ["亿", "万亿"] ["亿亿", "万亿亿"]
let bitstr = bits [bit % 2] + (new Array(Math.floor(bit / 2)).fill("亿")).join("");
bit2rmb += bitstr;
rmbArr.push(bit2rmb);
}
bit++;
}
const rmbStr = rmbArr.join("").replace(/^零*/, ""); // 去掉头部的 零
return rmbStr ? rmbStr + "元" : "";
}
// 四个为一组的进行转换 str.length必须为4位
function int2rmbBite(str) {
if (str.length < 4) {
str = new Array(4 - str.length).fill("0").join("") + str;
}
let bit = str.length - 1;
const a = [];
while (bit >= 0) {
let item = parseInt(str[bit]);
switch (bit) {
case 3:
a.unshift(numSup[item]);
break;
case 2:
a.unshift(numSup[item], "拾");
if (item === 1) a.shift(); // 10 有两种情况 拾 或者 壹拾
if (item === 0) a.splice(1, 1);
break;
case 1:
a.unshift(numSup[item], "佰");
if (item === 0) a.splice(1, 1);
break;
case 0 :
a.unshift(numSup[item], "仟");
if (item === 0) a.splice(1, 1);
}
bit--;
}
// 正则将连续的零转为一个零,之后再去掉末尾的 零
return a.join("").replace(/零{1,3}/g, "零").replace(/零$/, "");
}
function float2rmb(float = "") {
// 分割数值 获得角和分的值
const [jiao, fen] = float.split("");
let arr = [];
// 判断是否需要 X角
if (parseInt(jiao) > 0) {
arr.push(numSup[jiao] + "角");
}
// 判断是否需要 X分
if (parseInt(fen) > 0) {
arr.push(numSup[fen] + "分");
}
return arr.join("");
}