123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /**
- * 数值处理类
- */
- import {
- round
- } from "../utils/digit.js"
- import Decimal from "../utils/decimal.js"
- export class NumberManager {
- constructor() {}
- /**
- * 排列组合
- */
- combine = (m, n) => {
- if (m < n || n < 0) {
- return 0;
- }
- return this.factorial(m, m - n + 1) / this.factorial(n, 1);
- }
- /**
- * 阶乘函数
- */
- factorial = (max, min) => {
- if (max >= min && max > 1) {
- return max * this.factorial(max - 1, min);
- } else {
- return 1;
- }
- }
- /**
- * 随机一个区间数
- */
- random = (min, max) => {
- if (min >= 0 && max > 0 && max >= min) {
- const gab = max - min + 1
- return Math.floor(Math.random() * gab + min)
- }
- return 0
- }
- /**
- * @description 数字格式化
- * @param {number|string} number 要格式化的数字
- * @param {number} decimals 保留几位小数
- * @param {string} decimalPoint 小数点符号
- * @param {string} thousandsSeparator 千分位符号
- * @returns {string} 格式化后的数字
- *
- * 来源:uview
- */
- format = (number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') => {
- number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
- const n = !isFinite(+number) ? 0 : +number
- const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
- const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
- const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
- let s = ''
- s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
- const re = /(-?\d+)(\d{3})/
- while (re.test(s[0])) {
- s[0] = s[0].replace(re, `$1${sep}$2`)
- }
- if ((s[1] || '').length < prec) {
- s[1] = s[1] || ''
- s[1] += new Array(prec - s[1].length + 1).join('0')
- }
- return s.join(dec)
- }
- /**
- * 是否是数字(包含小数点)
- */
- isNumber = (value) => {
- return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
- }
- /**
- * 是否是整数
- */
- isDigits = (value) => {
- return /^\d+$/.test(value)
- }
- /**
- * 金额转大写
- */
- priceToUpper = (value) => {
- var fraction = ['角', '分'];
- var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
- var unit = [
- ['元', '万', '亿'],
- ['', '拾', '佰', '仟']
- ];
- var head = value < 0 ? '欠' : '';
- value = Math.abs(value);
- var s = '';
- for (var i = 0; i < fraction.length; i++) {
- s += (digit[Math.floor(value * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
- }
- s = s || '整';
- value = Math.floor(value);
- for (var i = 0; i < unit[0].length && value > 0; i++) {
- var p = '';
- for (var j = 0; j < unit[1].length && value > 0; j++) {
- p = digit[value % 10] + unit[1][j] + p;
- value = Math.floor(value / 10);
- }
- s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
- }
- return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
- }
- /**
- * 高精度加法
- * v1.1.4
- */
- add(a, b) {
- let result = new Decimal(a).add(new Decimal(b));
- return result.toNumber();
- }
- /**
- * 高精度减法
- * v1.1.4
- */
- sub(a, b) {
- let result = new Decimal(a).sub(new Decimal(b));
- return result.toNumber();
- }
- /**
- * 高精度乘法
- * v1.1.4
- */
- mul(a, b) {
- let result = new Decimal(a).mul(new Decimal(b));
- return result.toNumber();
- }
- /**
- * 高精度除法
- * v1.1.4
- */
- div(a, b) {
- let result = new Decimal(a).div(new Decimal(b));
- return result.toNumber();
- }
- }
|