UNPKG

bigint-transform

Version:

将长整型类型数据在前端以字符串类型展示,以每项不超过15位的字符串数组形式进行加减运算

146 lines (145 loc) 5.08 kB
/* -------------------------处理函数------------------------------- */ class Tool { // 补零操作 addZero(sum) { sum += '' let len = 15 - sum.length if (len <= 0) return sum console.log(sum.length) for (let i = 0; i < len - 1; i++) { sum = '0' + sum } return sum } // 负数补零操作 addZeroD(sum) { if (/[-]/g.test(sum)) { let len = 16 - sum.length, zero = '' if (len <= 0) return sum for (let i = 0; i < len - 1; i++) { zero += '0' } return sum.substr(0, 1) + zero + sum.substr(1, -1) } else { return this.addZero(sum) } } // 计算结果 plusArrFun(a, b) { return a.map((item, i) => { if (!b[i]) return item return i === a.length - 1 ? +item + +b[i] + '' : this.addZero(`${+item + +b[i]}`) }) } // 加法结果 minusArrFun(a, b) { return a.map((item, i) => { if (!b[i]) return item if (i === a.length - 1) return `${+item - +b[i]}` // TODO 测试 if (+item - +b[i] < 0) { let index = 0 while (+`${index}${item}` - +b[i] <= 0) { index++ } if (a[i + 1]) { a[i + 1] = i + 1 === a.length - 1 ? `${+a[i + 1] - index}` : this.addZero(`${+a[i + 1] - index}`) } return this.addZeroD(`${+(index + item) - +b[i]}`) } else { return this.addZeroD(`${+item - +b[i]}`) } }) } } /* --------------------------------------------------------------- */ const bigintTransform = { // 转化 pack: function (str) { if (!str || typeof str !== 'string') { if (typeof str === 'number' && `${str}`.length <= 16) { return this.pack(`${str}`) } console.log('数据项不合法') return 'Error' } let i = 0 let sumArr = [...str].reverse().reduce((total, cur, index) => { if (index % 15 === 0 && index / 15 !== 0) { i++ } if (!total[i]) { total[i] = '' } total[i] += cur return total }, []).map(item => [...item].reverse().join('')).reverse() let j = 0 while (Number(sumArr[j]) <= 0) { j++ } sumArr.splice(0, j) let res = sumArr.map((item, i) => { return i === 0 ? +item + '' : item }) console.log(`转化成功, 结果为[${res.join(',')}]`) return res }, // 解包 unpack: (arr) => { if (arr && Object.prototype.toString.call(arr) === '[object Array]') { if (arr.every(item => !isNaN(Number(item)))) { let res = arr.map(item => item + '').join('') for (let i = 0; i < arr.length - 1; i++) { if (i !== 0) { if (String(arr[i]).length !== 15) { console.log(`数据项不合法, 强制转化为${res}`) break } else { console.log(`转化成功, 结果为${res}`) break } } } return res } else { console.log('数据项不合法') return 'Error' } } }, // 增 plus: function (arrA, arrB) { if (arrA === 'Error' || arrB === 'Error') return arrA = arrA.reverse() arrB = arrB.reverse() let tool = new Tool() // 开始求和 let sumArr = arrA.length >= arrB.length ? tool.plusArrFun(arrA, arrB) : tool.plusArrFun(arrB, arrA) sumArr = sumArr.reverse() // 数据进位操作 sumArr.forEach((item, i) => { if (i === 0) return if (sumArr[i - 1] && item.length > 15) { sumArr[i] = item.substr(1, item.length - 1) sumArr[i - 1] = tool.addZero(`${+sumArr[i - 1] + +item.substr(0, 1)}`) } }) console.log(`计算结果是${sumArr.join('')}`) // 结果 return sumArr.join('') }, // 减 minus: function (arrA, arrB) { if (arrA === 'Error' || arrB === 'Error') return arrA = arrA.reverse() arrB = arrB.reverse() let tool = new Tool() let sumArr = arrA.length && arrB.length && arrA.length >= arrB.length ? tool.minusArrFun(arrA, arrB) : [...tool.minusArrFun(arrB, arrA), '-'] sumArr = sumArr.reverse().join('') console.log(`计算结果是${sumArr}`) return sumArr } } export default bigintTransform