UNPKG

@hzy1123581324/z-view-ui

Version:

z-view-ui是使用vue3开发的组件,开发中,有部分组件功能未实现,慎用

353 lines (320 loc) 11.6 kB
//添加原型链 /* 大数相加 在 js 中,对于超大整数的运算,还存在格式问题 当数字超出某个范围的时候,数字会自动转为科学计数法 这个时候如果还需要输出常规格式,就需要将数字转为字符串,然后实现一个字符串加法 */ Math.sumBigNumber = function(a, b) { var res = '', temp = 0; a = a.split(''); b = b.split(''); while (a.length || b.length || temp) { temp += ~~a.pop() + ~~b.pop(); res = (temp % 10) + res; temp = temp > 9; } return res.replace(/^0+/, ''); } /******************************精准运算*************************************/ //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 //调用:$h.Add(arg1,arg2) //返回值:arg1加上arg2的精确结果 Math.Add = function(arg1, arg2) { arg2 = parseFloat(arg2); var r1, r2, m; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(100, Math.max(r1, r2)); return (this.Mul(arg1, m) + this.Mul(arg2, m)) / m; } //减法函数,用来得到精确的减法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 //调用:$h.Sub(arg1,arg2) //返回值:arg1减去arg2的精确结果 Math.Sub = function(arg1, arg2) { arg1 = parseFloat(arg1); arg2 = parseFloat(arg2); var r1, r2, m, n; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); //动态控制精度长度 n = r1 >= r2 ? r1 : r2; return ((this.Mul(arg1, m) - this.Mul(arg2, m)) / m).toFixed(n); } /*乘法函数,用来得到精确的乘法结果 **说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 **调用:$h.Mul(arg1,arg2) **返回值:arg1乘以arg2的精确结果 */ Math.Mul = function(arg1, arg2) { arg1 = parseFloat(arg1); arg2 = parseFloat(arg2); var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); try { m += s1.split(".")[1].length; } catch (e) {} try { m += s2.split(".")[1].length; } catch (e) {} return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); } /* *除法函数,用来得到精确的除法结果 *说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 *调用:$h.Div(arg1,arg2) *返回值:arg1除以arg2的精确结果 */ Math.Div = function(arg1, arg2) { arg1 = parseFloat(arg1); arg2 = parseFloat(arg2); var t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.toString().split(".")[1].length; } catch (e) {} try { t2 = arg2.toString().split(".")[1].length; } catch (e) {} r1 = Number(arg1.toString().replace(".", "")); r2 = Number(arg2.toString().replace(".", "")); return r1 / r2 * Math.pow(10, t2 - t1); } /********************************数字拓展*************************************************************/ if(!Number.prototype.toFixed|| !("toFixed" in Number.prototype)){ Number.prototype.toFixed = function(length) { var carry = 0; //存放进位标志 var num, multiple; //num为原浮点数放大multiple倍后的数,multiple为10的length次方 var str = this + ''; //将调用该方法的数字转为字符串 var dot = str.indexOf("."); //找到小数点的位置 if (str.slice(dot + length + 1, dot + length + 2) >= 5) carry = 1; //找到要进行舍入的数的位置,手动判断是否大于等于5,满足条件进位标志置为1 multiple = Math.pow(10, length); //设置浮点数要扩大的倍数 num = Math.floor(this * multiple) + carry; //去掉舍入位后的所有数,然后加上我们的手动进位数 var result = num / multiple + ''; //将进位后的整数再缩小为原浮点数 /* * 处理进位后无小数 */ dot = result.indexOf("."); if (dot < 0) { result += '.'; dot = result.indexOf("."); } /* * 处理多次进位 */ var len = result.length - (dot + 1); if (len < length) { for (var i = 0; i < length - len; i++) { result += 0; } } return result; } } /** * @description 保留小数点多少位,处理算术运算后出现的误差,下取整 * @param {String} n 保留的小数点位数(默认是两位) * @param {String} isTrunc 小数点末位为零是否清除 * @returns {string|Number} */ Number.prototype.fixedPoint = function(n = 2,isTrunc=false) { // console.log(this,'&&&&&&&&&&&&&&') // (Array(5).join(0) let point = String(this.toFixed(n+4)).split('.')[1]||''; let int = String(this).split('.')[0]||''; // 后补零 // console.log(Array(n),Array(n+1).join(0)) // console.log( point.padEnd,'*******') let value = int + '.' + point.padEnd(n, '0').slice(0,n); if(isTrunc){ return parseFloat(value) ; }else{ return value ; } }; /********************************字符串拓展*************************************************************/ /** * @ */ if (!String.prototype.fixedPoint){ String.prototype.fixedPoint = function (n = 2,isTrunc=false){ let val = null; if(this === 'undefined'||this==="null"||this===''||isNaN(this)){ if(isTrunc){ return "0" }else{ return "0."+"0".repeat(n); } }else{ val = Number(this) } return val.fixedPoint(n,isTrunc) }; } // 第一种:替换所有的空格(包含换行符) // let str = '123AD asadf asadfasf\n adf\n' // let a = str.replace(/\s+/g,"&nbsp;") // console.log(a) // 123AD&nbsp;asadf&nbsp;asadfasf&nbsp;adf&nbsp; // 第二种:替换所有的空格(不包含换行符) // let str = '123AD asadf asadfasf\n adf\n' // let a = str.replace(/ +/g,"&nbsp;") // '123AD&nbsp;asadf&nbsp;asadfasf\n&nbsp;adf\n' // ———————————————— // 版权声明:本文为CSDN博主「F-Fanger」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 // 原文链接:https://blog.csdn.net/qq_41287158/article/details/122966525 /** * @description 去除空格 * @param {String} str 需要去除空格的字符串 * @param {String} pos both(左右)|left|right|all 默认both */ // trim方法扩展 if (!String.prototype.trim){ String.prototype.trim = function () { return this.replace(/(^\s*)|(\s*$)/g,''); } } //trimRight 弃用了 使用下面的trimEnd if (!String.prototype.trimRight){ String.prototype.trimRight = function () { return this.replace(/(\s*$)/g,''); } } if (!String.prototype.trimEnd){ String.prototype.trimEnd = function () { return this.replace(/(\s*$)/g,''); } } //trimLeft 弃用了 使用下面的trimStart if (!String.prototype.trimLeft){ String.prototype.trimLeft = function () { return this.replace(/(^\s*)/g,''); } } if (!String.prototype.trimStart){ String.prototype.trimStart = function () { return this.replace(/(^\s*)/g,''); } } if (!String.prototype.trimAll){ String.prototype.trimAll = function () { return this.replace(/(\s*)/g,''); } } // repeat()方法的polyfill if (!String.prototype.repeat) { String.prototype.repeat = function (count) { 'use strict'; if (this == null) { throw new TypeError('can\'t convert ' + this + ' to object'); } var str = '' + this; count = +count; if (count != count) { count = 0; } if (count < 0) { throw new RangeError('repeat count must be non-negative'); } if (count == Infinity) { throw new RangeError('repeat count must be less than infinity'); } count = Math.floor(count); if (str.length == 0 || count == 0) { return ''; } if (str.length * count >= 1 << 28) { throw new RangeError('repeat count must not overflow maximum string size'); } var rpt = ''; for (; ;) { if ((count & 1) == 1) { rpt += str; } count >>>= 1; if (count == 0) { break; } str += str; } return rpt; } } // padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序 // 所以这里做一个兼容polyfill的兼容处理 if (!String.prototype.padStart) { // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解 String.prototype.padStart = (maxLength, fillString = ' ') => { if (Object.prototype.toString.call(fillString) !== '[object String]') { throw new TypeError( 'fillString must be String' ) } const str = this // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉 if (str.length >= maxLength) return String(str) const fillLength = maxLength - str.length let times = Math.ceil(fillLength / fillString.length) while (times >>= 1) { fillString += fillString if (times === 1) { fillString += fillString } } return fillString.slice(0, fillLength) + str } } // padStart()方法的polyfill // if (!String.prototype.padStart) { // String.prototype.padStart = function (targetLength, padString) { // // 截断数字或将非数字转换为0 // targetLength = targetLength>>0; // padString = String((typeof padString !== 'undefined' ? padString : ' ')); // if (this.length > targetLength || padString === '') { // return String(this); // } // targetLength = targetLength-this.length; // if (targetLength > padString.length) { // // 添加到初始值以确保长度足够 // padString += padString.repeat(targetLength / padString.length); // } // return padString.slice(0, targetLength) + String(this); // }; // } // padEnd()方法的polyfill if (!String.prototype.padEnd) { String.prototype.padEnd = function (targetLength, padString) { // 转数值或者非数值转换成0 targetLength = targetLength >> 0; padString = String((typeof padString !== 'undefined' ? padString : ' ')); if (this.length > targetLength || padString === '') { return String(this); } targetLength = targetLength - this.length; if (targetLength > padString.length) { // 添加到初始值以确保长度足够 padString += padString.repeat(targetLength / padString.length); } return String(this) + padString.slice(0, targetLength); }; }