1. 程式人生 > 其它 >js 阿拉伯數字金額轉換為中文數字金額

js 阿拉伯數字金額轉換為中文數字金額

技術標籤:javaScriptjavascript

前言

最近遇到一個需求,需要把阿拉伯數字的金額如99.9元轉換為中文數字金額玖拾玖元玖分。想了一下,感覺思緒有點混亂,就在網上找了下。方法有很多,擇其一,根據自己的需求修改後,這裡記錄下來。大概思路如下:

1、宣告需要用到的中文數字
// 漢字的數字
const cnNums = ['零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'] 
// 基本單位
const cnIntRadice = ['', '拾', '佰', '仟'] 
// 對應整數部分擴充套件單位
const cnIntUnits =
['', '萬', '億', '兆'] // 對應小數部分單位 const cnDecUnits = ['角', '分', '毫', '釐'] // 整數金額時後面跟的字元 const cnInteger = '整' // 整型完以後的單位 const cnIntLast = '元'
2、定義兩個變數分別儲存整數部分和小數部分
// 金額整數部分
let IntegerNum 
// 金額小數部分
let DecimalNum 

if (money.indexOf('.') === -1) {
  IntegerNum = money
  DecimalNum = ''
} else {
  const
moneyArr = money.split('.') IntegerNum = moneyArr[0] DecimalNum = moneyArr[1].substr(0, 4) }
3、將阿拉伯數字轉為中文數字

這是整個流程的中心點和難點。大體的思路可分為:

  • 0~9的阿拉伯數字轉換,通過數字下標匹配獲取
for (let i = 0; i < IntegerNum.length; i++) {
// 通過遍歷拿到整數部分的每一項
let term = IntegerNum.substr(i, 1)
// 轉換數字,cnNums是儲存了中文零到玖的陣列,直接將阿拉伯數字作為下標獲取中文數字
ChineseStr += cnNums[parseInt(term)] }
  • 單位的獲取
for (let i = 0; i < IntegerNum.length; i++) {
// 剩餘待處理的數量
let surplus = IntLen - i - 1
// 用於獲取整數部分的擴充套件單位
// 剩餘數量除以4,比如12345,term為1時,expandUnit則為1,
// cnIntUnits[expandUnit]對應得到的單位為萬
let expandUnit = surplus / 4
// 用於獲取整數部分的基本單位
// 剩餘數量取餘4,比如123,那麼第一遍遍歷term為1,surplus為2,baseUnit則為2,
// 所以cnIntRadice[baseUnit]對應得到的基本單位為'佰'
let baseUnit = surplus % 4
// 基本單位轉換之後直接加上
ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
// 擴充套件單位要滿足大單位進階才加
// 同時滿足以下兩個條件則是大單位進階
// 剩餘數量是4的倍數,並且連續為0的數量不超過3個
if (baseUnit === 0 && zeroCount < 4) {
  ChineseStr += cnIntUnits[expandUnit]
}
}
完整程式碼:
function changeNumberMoneyToChinese (money) {
 // 接收數字或者字串數字
 if (typeof money === "string") {
   if (money === '') return ''
   if (isNaN(parseFloat(money))) {
     throw Error(`引數有誤:${money},請輸入數字或字串數字`)
   } else {
     // 去掉分隔符(,)
     money = money.replace(/,/g, '')
   }
 } else if (typeof money === "number") {
   // 去掉分隔符(,)
   money = money.toString().replace(/,/g, '')
 } else {
   throw Error(`引數有誤:${money},請輸入數字或字串數字`)
 }
 // 漢字的數字
 const cnNums = ['零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'] 
 // 基本單位
 const cnIntRadice = ['', '拾', '佰', '仟'] 
 // 對應整數部分擴充套件單位
 const cnIntUnits = ['', '萬', '億', '兆'] 
 // 對應小數部分單位
 const cnDecUnits = ['角', '分', '毫', '釐']
 // 整數金額時後面跟的字元
 const cnInteger = '整' 
 // 整型完以後的單位
 const cnIntLast = '元' 
 // 金額整數部分
 let IntegerNum 
 // 金額小數部分
 let DecimalNum 
 // 輸出的中文金額字串
 let ChineseStr = '' 
 // 正負值標記
 let Symbol = '' 
 // 轉成浮點數
 money = parseFloat(money)
 // 如果是0直接返回結果
 if (money === 0) {
   ChineseStr = cnNums[0] + cnIntLast + cnInteger
   return ChineseStr
 }
 // 如果小於0,則將Symbol標記為負,並轉為正數
 if (money < 0) {
   money = -money
   Symbol = '負 '
 }
 // 轉換為字串
 money = money.toString()
 // 將整數部分和小數部分分別存入IntegerNum和DecimalNum
 if (money.indexOf('.') === -1) {
   IntegerNum = money
   DecimalNum = ''
 } else {
   const moneyArr = money.split('.')
   IntegerNum = moneyArr[0]
   DecimalNum = moneyArr[1].substr(0, 4)
 }
 // 獲取整型部分轉換
 if (parseInt(IntegerNum, 10) > 0) {
   let zeroCount = 0
   let IntLen = IntegerNum.length
   for (let i = 0; i < IntLen; i++) {
     // 獲取整數的每一項
     let term = IntegerNum.substr(i, 1)
     // 剩餘待處理的數量
     let surplus = IntLen - i - 1
     // 用於獲取整數部分的擴充套件單位
     // 剩餘數量除以4,比如12345,term為1時,expandUnit則為1,
     // cnIntUnits[expandUnit]對應得到的單位為萬
     let expandUnit = surplus / 4
     // 用於獲取整數部分的基本單位
     // 剩餘數量取餘4,比如123,那麼第一遍遍歷term為1,surplus為2,baseUnit則為2,
     // 所以cnIntRadice[baseUnit]對應得到的基本單位為'佰'
     let baseUnit = surplus % 4
     if (term === '0') {
       zeroCount++
     } else {
       // 連續存在多個0的時候需要補'零'
       if (zeroCount > 0) {
         ChineseStr += cnNums[0]
       }
       // 歸零
       zeroCount = 0
       /* 
       cnNums是漢字的零到玖組成的陣列,term則是阿拉伯0-9,
       直接將阿拉伯數字作為下標獲取中文數字
       例如term是0則cnNums[parseInt(term)]取的就是'零',9取的就是'玖'
       最後加上單位就轉換成功了!
       這裡只加十百千的單位
       */
       ChineseStr += cnNums[parseInt(term)] + cnIntRadice[baseUnit]
     }
     /*
       如果baseUnit為0,意味著當前項和下一項隔了一個節權位即隔了一個逗號
       擴充套件單位只有大單位進階才需要,判斷是否大單位進階,則通過zeroCount判斷
       baseUnit === 0即存在逗號,baseUnit === 0 && zeroCount < 4 意為大單位進階
     */
     if (baseUnit === 0 && zeroCount < 4) {
       ChineseStr += cnIntUnits[expandUnit]
     }
   }
   ChineseStr += cnIntLast
 }
 // 小數部分轉換
 if (DecimalNum !== '') {
   let decLen = DecimalNum.length
   for (let i = 0; i < decLen; i++) {
     // 同理,參考整數部分
     let term = DecimalNum.substr(i, 1)
     if (term !== '0') {
       ChineseStr += cnNums[Number(term)] + cnDecUnits[i]
     }
   }
 }
 ChineseStr = Symbol + ChineseStr
 return ChineseStr
}

最終結果:
在這裡插入圖片描述
阿拉伯數字金額轉中文金額方法有很多種,至於這裡為什麼選擇這一種,因為它跟我最初的想法有點相似,即通過陣列匹配轉換中文。
這裡也感謝博主提供的思路,已點贊:)

THE END