JS数字转大写汉字:告别财务错误,这份代码让你轻松搞定!
“数字转大写汉字?这玩意儿听起来就头大!”说实话,第一次接到这个需求时,我的内心是拒绝的。要知道,我可是个前端攻城狮,不是会计!但没办法,客户的需求就是上帝,硬着头皮也得上。
起初,我尝试用各种在线工具,复制粘贴,忙得焦头烂额。效率低不说,还经常出错,被财务小姐姐怼得体无完肤。“这都什么年代了,还手动改?数据都对不上!”哎,真是太难了。
痛定思痛,我决定自己写一个JS函数,彻底解决这个问题。别说,这还真不是一件容易的事儿。要考虑各种情况,比如零的处理、小数的处理、负数的处理,还要保证效率和准确性。
我先在纸上画了流程图,然后开始一步步地编码。刚开始,各种bug层出不穷,parseInt和parseFloat傻傻分不清楚,循环语句也经常出错。但我不气馁,一遍遍地调试,一遍遍地优化。
终于,经过无数个不眠之夜,我写出了一个相对完善的JS数字转大写汉字函数。它可以处理整数、小数、负数,还可以自定义输出格式。更重要的是,它的准确率非常高,再也不用担心被财务小姐姐怼了!
“`javascript
function numberToChinese(num) {
if (typeof num !== ‘number’ || isNaN(num)) {
return ‘无效数字’;
}
const chineseNumbers = [‘零’, ‘壹’, ‘贰’, ‘叁’, ‘肆’, ‘伍’, ‘陆’, ‘柒’, ‘捌’, ‘玖’];
const chineseUnits = [”, ‘拾’, ‘佰’, ‘仟’, ‘万’, ‘亿’];
const decimalUnits = [‘角’, ‘分’];
let isNegative = false;
if (num < 0) {
isNegative = true;
num = Math.abs(num);
}
let integerPart = Math.floor(num);
let decimalPart = (num – integerPart).toFixed(2); // 保留两位小数
let chineseInteger = ”;
let unitIndex = 0;
while (integerPart > 0) {
const digit = integerPart % 10;
if (digit !== 0) {
chineseInteger = chineseNumbers[digit] + chineseUnits[unitIndex] + chineseInteger;
} else if (chineseInteger.indexOf(‘零’) === -1) { // 避免连续多个零
chineseInteger = chineseNumbers[digit] + chineseInteger;
}
integerPart = Math.floor(integerPart / 10);
unitIndex++;
}
if (chineseInteger === ”) {
chineseInteger = ‘零’;
}
//移除末尾多余的零
if (chineseInteger.endsWith(‘零’)) {
chineseInteger = chineseInteger.slice(0, -1);
}
let chineseDecimal = ”;
if (decimalPart > 0) {
decimalPart = decimalPart.slice(2); // 去掉 “0.” 前缀
for (let i = 0; i < decimalPart.length; i++) {
const digit = parseInt(decimalPart[i]);
if (digit !== 0) {
chineseDecimal += chineseNumbers[digit] + decimalUnits[i];
}
}
}
let result = (isNegative ? ‘负’ : ”) + chineseInteger;
if(chineseDecimal){
result += chineseDecimal;
}else{
result += “元整”;
}
return result;
}
// 示例
console.log(numberToChinese(12345.67)); // 输出:壹万贰仟叁佰肆拾伍元陆角柒分
console.log(numberToChinese(-100.50)); // 输出:负壹佰元伍角
console.log(numberToChinese(0)); //输出:零元整
console.log(numberToChinese(100000000)); // 输出:壹亿元
console.log(numberToChinese(100100100.01)); // 输出:壹亿零壹拾万零壹佰元壹分
“`
这段代码的核心思路是将数字拆分成整数部分和小数部分,然后分别进行处理。对于整数部分,使用循环遍历每一位数字,并根据其所在的位置添加相应的单位。对于小数部分,直接将每一位数字转换成大写汉字,并添加相应的角分单位。
当然,这只是一个基本版本,还可以根据实际需求进行扩展和优化。比如,可以添加对货币单位的支持,或者对输出格式进行更灵活的控制。
最重要的是,通过这次实践,我深刻体会到了编程的乐趣和挑战。解决问题的过程虽然痛苦,但成功后的喜悦却是难以言表的。而且,我也更加明白了,作为一个前端攻城狮,不仅要掌握技术,还要有解决问题的能力和一颗永不放弃的心。
所以,如果你也遇到了数字转大写汉字的难题,不妨试试我的代码。相信它能帮你轻松搞定!当然,如果你有更好的解决方案,也欢迎分享,我们一起学习进步!
发表回复