时空网前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.4 KiB

5 years ago
  1. const cnNums = ['\u96f6', '\u58f9', '\u8d30', '\u53c1', '\u8086', '\u4f0d', '\u9646', '\u67d2', '\u634c', '\u7396']
  2. // 拾 \u62fe 佰 \u4f70 仟 \u4edf
  3. const cnIntRadice = ['', '\u62fe', '\u4f70', '\u4edf']
  4. // 万 \u4e07 亿 \u4ebf 兆 \u5146
  5. const cnIntUnits = ['', '\u4e07', '\u4ebf', '兆']
  6. // 角 \u89d2 分 \u5206 毫 \u6beb 厘 \u5398
  7. const cnDecUnits = ['\u89d2', '\u5206', '\u6beb', '\u5398']
  8. const cnInteger = '\u6574' // 整 \u6574
  9. const cnIntLast = '\u5143' // 元 \u5143
  10. const cnNegative = '\u8d1f' // 负
  11. // Maximum number
  12. const maxNum = 999999999999999.9999
  13. export default function(number) {
  14. let negative
  15. // Integral part
  16. let integerNum
  17. // Decimal part
  18. let decimalNum
  19. // Capital number
  20. let capitalStr = ''
  21. let parts
  22. /* istanbul ignore if */
  23. if (number === '') {
  24. return ''
  25. }
  26. number = parseFloat(number)
  27. if (number < 0) {
  28. negative = true
  29. number = Math.abs(number)
  30. }
  31. /* istanbul ignore if */
  32. if (number >= maxNum) {
  33. return ''
  34. }
  35. /* istanbul ignore if */
  36. if (number === 0) {
  37. capitalStr = cnNums[0] + cnIntLast + cnInteger
  38. return capitalStr
  39. }
  40. // Convert to String
  41. number += ''
  42. if (number.indexOf('.') === -1) {
  43. integerNum = number
  44. decimalNum = ''
  45. } else {
  46. parts = number.split('.')
  47. integerNum = parts[0]
  48. decimalNum = parts[1].substr(0, 4)
  49. }
  50. // Convert integer part
  51. if (parseInt(integerNum, 10) > 0) {
  52. let zeroCount = 0
  53. for (let i = 0, IntLen = integerNum.length; i < IntLen; i++) {
  54. const n = integerNum.substr(i, 1)
  55. const p = IntLen - i - 1
  56. const q = p / 4
  57. const m = p % 4
  58. if (n === '0') {
  59. zeroCount++
  60. } else {
  61. if (zeroCount > 0) {
  62. capitalStr += cnNums[0]
  63. }
  64. zeroCount = 0
  65. capitalStr += cnNums[parseInt(n)] + cnIntRadice[m]
  66. }
  67. if (m === 0 && zeroCount < 4) {
  68. capitalStr += cnIntUnits[q]
  69. }
  70. }
  71. capitalStr += cnIntLast
  72. }
  73. // Convert decimal part
  74. if (decimalNum !== '') {
  75. for (let i = 0, decLen = decimalNum.length; i < decLen; i++) {
  76. const n = decimalNum.substr(i, 1)
  77. if (n !== '0') {
  78. capitalStr += cnNums[Number(n)] + cnDecUnits[i]
  79. }
  80. }
  81. }
  82. /* istanbul ignore if */
  83. if (capitalStr === '') {
  84. capitalStr += cnNums[0] + cnIntLast + cnInteger
  85. } else if (decimalNum === '') {
  86. capitalStr += cnInteger
  87. }
  88. if (negative) {
  89. capitalStr = `${cnNegative}${capitalStr}`
  90. }
  91. return capitalStr
  92. }