index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. export function numberToChinese(num) {
  2. // 处理非数字、负数或小数情况
  3. if (isNaN(num) || num < 0 || !Number.isInteger(num)) {
  4. return "无效非负整数";
  5. }
  6. // 定义基本数字对应的中文
  7. const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  8. // 定义单位(对应不同位数:个、十、百、千、万、十、百、千、亿、十、百、千)
  9. const units = ['', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千'];
  10. // 处理0的情况
  11. if (num === 0) {
  12. return digits[0];
  13. }
  14. const numStr = num.toString();
  15. const length = numStr.length;
  16. let result = '';
  17. let zeroFlag = false; // 标记是否需要补零
  18. for (let i = 0; i < length; i++) {
  19. const digit = parseInt(numStr[i]);
  20. const position = length - 1 - i; // 计算当前数字的位数索引
  21. if (digit !== 0) {
  22. // 如果之前有零,先补一个零
  23. if (zeroFlag) {
  24. result += digits[0];
  25. zeroFlag = false;
  26. }
  27. result += digits[digit] + units[position];
  28. } else {
  29. // 当前数字是零,标记需要补零(但不立即补)
  30. zeroFlag = true;
  31. // 处理单位在万、亿时的特殊情况(避免连续单位)
  32. if (units[position] === '万' || units[position] === '亿') {
  33. result += units[position];
  34. zeroFlag = false; // 万/亿单位后重置零标记
  35. }
  36. }
  37. }
  38. // 处理十位数的特殊情况(如10->十,而不是一十)
  39. if (result.startsWith('一十')) {
  40. result = result.substring(1);
  41. }
  42. return result;
  43. }