index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /**
  2. * 数值处理类
  3. */
  4. import {
  5. round
  6. } from "../utils/digit.js"
  7. import Decimal from "../utils/decimal.js"
  8. export class NumberManager {
  9. constructor() {}
  10. /**
  11. * 排列组合
  12. */
  13. combine = (m, n) => {
  14. if (m < n || n < 0) {
  15. return 0;
  16. }
  17. return this.factorial(m, m - n + 1) / this.factorial(n, 1);
  18. }
  19. /**
  20. * 阶乘函数
  21. */
  22. factorial = (max, min) => {
  23. if (max >= min && max > 1) {
  24. return max * this.factorial(max - 1, min);
  25. } else {
  26. return 1;
  27. }
  28. }
  29. /**
  30. * 随机一个区间数
  31. */
  32. random = (min, max) => {
  33. if (min >= 0 && max > 0 && max >= min) {
  34. const gab = max - min + 1
  35. return Math.floor(Math.random() * gab + min)
  36. }
  37. return 0
  38. }
  39. /**
  40. * @description 数字格式化
  41. * @param {number|string} number 要格式化的数字
  42. * @param {number} decimals 保留几位小数
  43. * @param {string} decimalPoint 小数点符号
  44. * @param {string} thousandsSeparator 千分位符号
  45. * @returns {string} 格式化后的数字
  46. *
  47. * 来源:uview
  48. */
  49. format = (number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') => {
  50. number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
  51. const n = !isFinite(+number) ? 0 : +number
  52. const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
  53. const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
  54. const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
  55. let s = ''
  56. s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
  57. const re = /(-?\d+)(\d{3})/
  58. while (re.test(s[0])) {
  59. s[0] = s[0].replace(re, `$1${sep}$2`)
  60. }
  61. if ((s[1] || '').length < prec) {
  62. s[1] = s[1] || ''
  63. s[1] += new Array(prec - s[1].length + 1).join('0')
  64. }
  65. return s.join(dec)
  66. }
  67. /**
  68. * 是否是数字(包含小数点)
  69. */
  70. isNumber = (value) => {
  71. return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
  72. }
  73. /**
  74. * 是否是整数
  75. */
  76. isDigits = (value) => {
  77. return /^\d+$/.test(value)
  78. }
  79. /**
  80. * 金额转大写
  81. */
  82. priceToUpper = (value) => {
  83. var fraction = ['角', '分'];
  84. var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  85. var unit = [
  86. ['元', '万', '亿'],
  87. ['', '拾', '佰', '仟']
  88. ];
  89. var head = value < 0 ? '欠' : '';
  90. value = Math.abs(value);
  91. var s = '';
  92. for (var i = 0; i < fraction.length; i++) {
  93. s += (digit[Math.floor(value * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
  94. }
  95. s = s || '整';
  96. value = Math.floor(value);
  97. for (var i = 0; i < unit[0].length && value > 0; i++) {
  98. var p = '';
  99. for (var j = 0; j < unit[1].length && value > 0; j++) {
  100. p = digit[value % 10] + unit[1][j] + p;
  101. value = Math.floor(value / 10);
  102. }
  103. s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
  104. }
  105. return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
  106. }
  107. /**
  108. * 高精度加法
  109. * v1.1.4
  110. */
  111. add(a, b) {
  112. let result = new Decimal(a).add(new Decimal(b));
  113. return result.toNumber();
  114. }
  115. /**
  116. * 高精度减法
  117. * v1.1.4
  118. */
  119. sub(a, b) {
  120. let result = new Decimal(a).sub(new Decimal(b));
  121. return result.toNumber();
  122. }
  123. /**
  124. * 高精度乘法
  125. * v1.1.4
  126. */
  127. mul(a, b) {
  128. let result = new Decimal(a).mul(new Decimal(b));
  129. return result.toNumber();
  130. }
  131. /**
  132. * 高精度除法
  133. * v1.1.4
  134. */
  135. div(a, b) {
  136. let result = new Decimal(a).div(new Decimal(b));
  137. return result.toNumber();
  138. }
  139. }