前端面试题——阿拉伯数字转中文数字

173 阅读1分钟

参考juejin.cn/post/705676… 写的水文章

  // 划分整数和小数部分
  let arr = num.toString().split('.')

  // 处理小数部分
  let decimal = ''
  let number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  if (arr[1]) {
    decimal = '点' + [...arr[1]].map(item => number[item]).join('')
  }

  // 处理整数部分
  let unit = ['', '万', '亿']
  // 反转字符串
  let str = arr[0].toString().split('').reverse().join('')
  let arr4 = []
  // 从低位开始划分,四个为一组
  for (let i = 0; i < str.length;) {
    arr4.push(fourNumToChinese(str.slice(i, i + 4)))
    i += 4
  }

  // 拼接单位
  let result = ''
  for (let i = 0; i < arr4.length; i++) {
    // arr4的返回值存在以下几种情况,比如:
    // 零四百五十
    // 一千五百八十
    // 空字符串
    // 前面两种情况可直接拼接单位,
    // 为空字符串时:
    // [ "零一十二", "", "一百" ] => 一百亿零一十二, 空字符串是需要忽略的,不需要添加单位也不需要拼接
    // 0 => [''], 没有arr4[i+1],不能忽略

    if (!arr4[i] && i == arr4.length - 1) {
      result = '零'
    }
    if (!arr4[i]) continue
    // 数字+单位+result
    result = arr4[i] + unit[i] + result

  }
  return result + decimal
}

// 4321 => 一千二百三十四
function fourNumToChinese(str) {
  let unit = ['', '十', '百', '千']
  let number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']

  let result = ''
  for (let i = 0; i < str.length; i++) {
    //去除重复0,只保存一个零
    if (i > 0 && str[i] == '0' && str[i - 1] == '0') {
      continue
    }
    // 如果当前为0,则不需要添加单位
    // 一千零百三十 => 一千零三十
    if (str[i] == '0') {
      result = number[str[i]] + result
    } else {
      // 数字+单位+result
      result = number[str[i]] + unit[i] + result
    }

  }

  // 1000: 一千零
  // 去除末尾零
  if (result[result.length - 1] == '零') {
    let arr = result.split('')
    arr.pop()
    result = arr.join('')
  }

  // 11 : 一十一,去除首部一
  if (str.length == 2 && str[1] == '1') {
    let arr = result.split('')
    arr.shift()
    result = arr.join('')
  }

  return result
}

let arr1 = [0, 1.987, 10, 10000000001, 133, 1030, 10405, 10450, 10400]

arr1.forEach(item => console.log(toChinese(item)))

图片.png