例如: 将金额12341234 转换为 一千二百三十四万一千二百三十四
第一步
- 按照中文书写习惯,每4位利用
,号进行分割
- 根据
,号将分成数组
filter去掉空串
function toChineseNumber(num) {
const parts = num.toString().replace(/(?=(\d{4})+$)/g,',').split(',').filter(Boolean);
}
['1234', '1234']
第二步
- 单独看数组的某一项
1234
- 循环
1234,并将其映射为中文
const chineseMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
function toChineseNumber(num) {
const parts = num.toString().replace(/(?=(\d{4})+$)/g,',').split(',').filter(Boolean);
for(let i = 0; i < parts.length; i++) {
const c = _transform(parts[i]);
}
}
function _transform(str) {
let result = '';
for(let i = 0; i < str.length; i++) {
let c = chineseMap[str[i]];
}
console.log(result);
return result;
}
一二三四
一二三四
第三步
...
const units = ['', '十', '百', '千'];
function _transform(str) {
let result = '';
for(let i = 0; i < str.length; i++) {
let c = chineseMap[str[i]];
let u = units[str.length - i - 1];
result += c + u;
}
return result;
}
一千二百三十四
一千二百三十四
...
function _transform(str) {
let result = '';
for(let i = 0; i < str.length; i++) {
let c = chineseMap[str[i]];
let u = units[str.length - i - 1];
if (c === '零') {
u = '';
}
if (c === '一' && u === '十') {
c = '';
}
result += c + u;
}
return _handleZero(result);
}
function _handleZero(str) {
return str.replace(/零+/g, '零').replace(/零$/g, '');
}
第四步
...
const bitUnits = ['', '万', '亿'];
function toChineseNumber(num) {
const parts = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean);
let result = '';
for(let i = 0; i < parts.length; i++) {
const c = _transform(parts[i]);
let u = bitUnits[parts.length - i - 1];
if (c === '') {
result += '零';
continue;
}
result += c + u;
}
return _handleZero(result);
}
...
最终代码如下:
const chineseMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
const units = ['', '十', '百', '千'];
const bitUnits = ['', '万', '亿'];
function toChineseNumber(num) {
const parts = num.toString().replace(/(?=(\d{4})+$)/g, ',').split(',').filter(Boolean);
let result = '';
for(let i = 0; i < parts.length; i++) {
const c = _transform(parts[i]);
let u = bitUnits[parts.length - i - 1];
if (c === '') {
result += '零';
continue;
}
result += c + u;
}
return _handleZero(result);
}
function _transform(str) {
let result = '';
for(let i = 0; i < str.length; i++) {
let c = chineseMap[str[i]];
let u = units[str.length - i - 1];
if (c === '零') {
u = '';
}
if (c === '一' && u === '十') {
c = '';
}
result += c + u;
}
result = _handleZero(result);
return result;
}
function _handleZero(str) {
return str.replace(/零+/g, '零').replace(/零$/g, '');
}
console.log(toChineseNumber(12341234))