@hzy1123581324/z-view-ui
Version:
z-view-ui是使用vue3开发的组件,开发中,有部分组件功能未实现,慎用
353 lines (320 loc) • 11.6 kB
JavaScript
//添加原型链
/*
大数相加
在 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," ")
// console.log(a) // 123AD asadf asadfasf adf
// 第二种:替换所有的空格(不包含换行符)
// let str = '123AD asadf asadfasf\n adf\n'
// let a = str.replace(/ +/g," ") // '123AD asadf asadfasf\n 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);
};
}