javascript
复制代码
ChineseWords.js文件
const ChineseWords = (value) => {
return currencyToChinese(value, {
currency: false
})
}
const CN_NUMBERS = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
const CN_UNITS = ['', '拾', '佰', '仟'];
const CN_SECTION_UNITS = ['', '万', '亿', '万亿'];
const CN_DECIMAL_UNITS = ['角', '分'];
/**
* 将金额转换为中文
* @param {number|string} amount 金额,可以是数字或字符串
* @param {object} options 选项对象
* @param {boolean} options.currency 是否添加人民币字样
* @returns {string} 中文金额表示
*/
const currencyToChinese = (
amount,
options
) => {
if (amount === null || amount === undefined || amount === '') {
return options.currency ? '人民币零元整' : '零元整';
}
// 转换为数字并验证
const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;
if (isNaN(num)) {
throw new Error('无效的金额格式');
}
if (Math.abs(num) >= 999999999999.99) {
throw new Error('金额超出处理范围(最大支持9999亿)');
}
// 处理负数
const isNegative = num < 0;
const absAmount = Math.abs(num);
// 分离整数和小数部分
const [integerPart, decimalPart] = absAmount.toFixed(2).split('.');
let result = '';
// 处理整数部分
if (integerPart !== '0') {
result += convertInteger(integerPart);
}
// 处理小数部分
if (decimalPart && decimalPart !== '00') {
if (result) {
result += '元';
}
result += convertDecimal(decimalPart);
} else {
if (result) {
result += '元整';
} else {
result = '零元整';
}
}
// 添加人民币字样
if (options.currency) {
result = '人民币' + result;
}
// 添加负号
if (isNegative) {
result = '负' + result;
}
return result;
}
/**
* 将整数转换为中文
* @param {string} integerStr 整数字符串
*/
const convertInteger = (integerStr) => {
const num = parseInt(integerStr, 10);
if (num === 0) return '';
let result = '';
const str = num.toString();
const len = str.length;
let zeroCount = 0;
for (let i = 0; i < len; i++) {
const n = parseInt(str[i], 10);
const pos = len - i - 1;
const section = Math.floor(pos / 4);
const unitPos = pos % 4;
if (n === 0) {
zeroCount++;
} else {
if (zeroCount > 0) {
result += '零';
zeroCount = 0;
}
result += CN_NUMBERS[n] + CN_UNITS[unitPos];
}
// 处理万、亿等单位
if (unitPos === 0 && section > 0) {
if (zeroCount < 4) {
result += CN_SECTION_UNITS[section];
}
zeroCount = 0;
}
}
return result;
}
/**
* 将小数部分转换为中文
* @param {string} decimalStr 小数字符串
*/
const convertDecimal = (decimalStr) => {
let result = '';
for (let i = 0; i < decimalStr.length && i < 2; i++) {
const n = parseInt(decimalStr[i], 10);
if (n !== 0) {
result += CN_NUMBERS[n] + CN_DECIMAL_UNITS[i];
}
}
return result || '';
}
/**
* 将金额转换为中文
* @param {number|string} amount 金额,可以是数字或字符串
*/
const amountToChinese = (amount) => {
return currencyToChinese(amount, { currency: false });
}
/**
* 验证金额是否有效
* @param {number|string} amount 金额,可以是数字或字符串
* @returns {boolean} 是否有效
*/
const validateAmount = (amount) => {
if (amount === null || amount === undefined || amount === '') {
return false;
}
const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;
return !isNaN(num) && Math.abs(num) < 999999999999.99;
}
/**
* 格式化金额
* @param {number|string} amount 金额,可以是数字或字符串
* @returns {string} 格式化后的金额
*/
const formatAmount = (amount) => {
if (amount === null || amount === undefined || amount === '') {
return '0.00';
}
const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;
if (isNaN(num)) return '0.00';
return num.toLocaleString('zh-CN', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
}
export default ChineseWords