906 lines
25 KiB
JavaScript
906 lines
25 KiB
JavaScript
|
|
"use strict";
|
|||
|
|
cc._RF.push(module, '693baLcvz1DyrnZJgdT0PMM', 'nx.math');
|
|||
|
|
// Scripts/nx/kernel/nx.math.js
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
|
|||
|
|
/*******************************************************************************
|
|||
|
|
*
|
|||
|
|
* Nx数据结构相关方法
|
|||
|
|
*
|
|||
|
|
*
|
|||
|
|
*
|
|||
|
|
* 2021.12.10
|
|||
|
|
******************************************************************************/
|
|||
|
|
|
|||
|
|
require("base64");
|
|||
|
|
require("rseed");
|
|||
|
|
var md = require("md5");
|
|||
|
|
|
|||
|
|
// 默认小数位数
|
|||
|
|
var DefPN = 2;
|
|||
|
|
var NxMath = cc.Class({
|
|||
|
|
name: "NxMath",
|
|||
|
|
// 创建
|
|||
|
|
ctor: function ctor() {
|
|||
|
|
this.uuTracker = 1000;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:基本的数据类型判断
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 数字
|
|||
|
|
numGood: function numGood(_n) {
|
|||
|
|
return _n === +_n;
|
|||
|
|
},
|
|||
|
|
// 正数
|
|||
|
|
numPositive: function numPositive(_n, _inZero /* true */) {
|
|||
|
|
if (!this.numGood(_n)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return _inZero !== false ? _n >= 0 : _n > 0;
|
|||
|
|
},
|
|||
|
|
// 为X的数
|
|||
|
|
numEqual: function numEqual(_n, _t) {
|
|||
|
|
return this.numGood(_n) && _n == _t;
|
|||
|
|
},
|
|||
|
|
// 大于X的数
|
|||
|
|
numGreater: function numGreater(_n, _t) {
|
|||
|
|
return this.numGood(_n) && _n > _t;
|
|||
|
|
},
|
|||
|
|
// 小于X的数
|
|||
|
|
numLess: function numLess(_n, _t) {
|
|||
|
|
return this.numGood(_n) && _n < _t;
|
|||
|
|
},
|
|||
|
|
// 范围内的数
|
|||
|
|
numInRange: function numInRange(_n, _range /* [x,y] */) {
|
|||
|
|
if (!this.arrGood(_range) || _range.length != 2) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return this.numGood(_n) && _n >= _range[0] && _n <= _range[1];
|
|||
|
|
},
|
|||
|
|
// 数字修正
|
|||
|
|
numFix: function numFix(_num, _def) {
|
|||
|
|
if (_def === void 0) {
|
|||
|
|
_def = 0;
|
|||
|
|
}
|
|||
|
|
var ret = _num;
|
|||
|
|
if (!nx.dt.numGood(ret)) {
|
|||
|
|
ret = _def;
|
|||
|
|
}
|
|||
|
|
return ret;
|
|||
|
|
},
|
|||
|
|
// 浮点精确度
|
|||
|
|
toFixedDecimal: function toFixedDecimal(_n) {
|
|||
|
|
if (!this.numGood(_n)) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 多保留一位来保证浮点数精度
|
|||
|
|
var fixedNumber = (_n * 100).toFixed(1);
|
|||
|
|
return Number((parseInt(fixedNumber) / 100).toFixed(2));
|
|||
|
|
},
|
|||
|
|
// 布尔
|
|||
|
|
isBool: function isBool(_b) {
|
|||
|
|
return _b === !!_b;
|
|||
|
|
},
|
|||
|
|
// 字节数格式化
|
|||
|
|
formatBytes: function formatBytes(bytes, decimals) {
|
|||
|
|
if (decimals === void 0) {
|
|||
|
|
decimals = 2;
|
|||
|
|
}
|
|||
|
|
if (bytes === 0) return '0 Bytes';
|
|||
|
|
var k = 1024;
|
|||
|
|
var dm = decimals & lt;
|
|||
|
|
0 ? 0 : decimals;
|
|||
|
|
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
|||
|
|
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|||
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:方法的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 有效方法
|
|||
|
|
fnGood: function fnGood(_f) {
|
|||
|
|
return _f != null && typeof _f === "function";
|
|||
|
|
},
|
|||
|
|
// 空方法
|
|||
|
|
fnEmpty: function fnEmpty() {},
|
|||
|
|
// 空方法报错
|
|||
|
|
fnEmptyError: function fnEmptyError(_fn) {
|
|||
|
|
if (this.fnGood(_fn)) {
|
|||
|
|
nx.error("方法已经存在:", _fn.name);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// 安全回调
|
|||
|
|
fnInvoke: function fnInvoke(_fn) {
|
|||
|
|
if (!this.fnGood(_fn)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (CC_DEBUG) {
|
|||
|
|
_fn.apply(null, Array.prototype.slice.call(arguments, 1));
|
|||
|
|
} else {
|
|||
|
|
try {
|
|||
|
|
_fn.apply(null, Array.prototype.slice.call(arguments, 1));
|
|||
|
|
} catch (e) {
|
|||
|
|
nx.error("[异常]:" + (e ? e.message + "\n" + e.stack : "未知错误!"));
|
|||
|
|
if (e && cc.sys.isNative && window && window.__errorHandler) {
|
|||
|
|
window.__errorHandler(e.message, "", "", e.stack);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:字符串的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 字符串
|
|||
|
|
strGood: function strGood(_s) {
|
|||
|
|
return _s === _s + "";
|
|||
|
|
},
|
|||
|
|
// 非空字符串
|
|||
|
|
strNEmpty: function strNEmpty(_s) {
|
|||
|
|
return this.strGood(_s) && _s != "";
|
|||
|
|
},
|
|||
|
|
// 空字符串
|
|||
|
|
strEmpty: function strEmpty(_s) {
|
|||
|
|
return !this.strNEmpty(_s);
|
|||
|
|
},
|
|||
|
|
// 字符串去空格
|
|||
|
|
strTrim: function strTrim(_s) {
|
|||
|
|
if (this.strNEmpty(_s)) {
|
|||
|
|
return _s.replace(/^(\s|\u00A0)+/, "").replace(/(\s|\u00A0)+$/, "");
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
},
|
|||
|
|
// 获取字节长度
|
|||
|
|
strBytes: function strBytes(_s) {
|
|||
|
|
if (!this.strNEmpty(_s)) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
var len = 0;
|
|||
|
|
for (var i = 0; i < _s.length; i++) {
|
|||
|
|
var a = _s.charAt(i);
|
|||
|
|
if (a.match(/[^\x00-\xff]/ig) != null) {
|
|||
|
|
len += 2;
|
|||
|
|
} else {
|
|||
|
|
len += 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return len;
|
|||
|
|
},
|
|||
|
|
// 字符串省略截取
|
|||
|
|
strCut: function strCut(str, len) {
|
|||
|
|
if (!str || !len) {
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
var build = "";
|
|||
|
|
for (var i = 0; i < str.length && len > 0; i++) {
|
|||
|
|
build += str.substr(i, 1);
|
|||
|
|
len -= str.charCodeAt(i) > 127 ? 2 : 1;
|
|||
|
|
}
|
|||
|
|
if (build.length < str.length) build += "..";
|
|||
|
|
return build;
|
|||
|
|
},
|
|||
|
|
// 字符串省略截取(逆向)
|
|||
|
|
strCutR: function strCutR(str, len) {
|
|||
|
|
if (!str || !len) {
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
var build = "";
|
|||
|
|
for (var i = str.length - 1; i >= 0 && len > 0; i--) {
|
|||
|
|
build = str.substr(i, 1) + build;
|
|||
|
|
len -= str.charCodeAt(i) > 127 ? 2 : 1;
|
|||
|
|
}
|
|||
|
|
if (build.length < str.length) {
|
|||
|
|
build = "****" + build;
|
|||
|
|
}
|
|||
|
|
return build;
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* key#value属性串转数组
|
|||
|
|
* @param {*} _sp
|
|||
|
|
*/
|
|||
|
|
pairSplit: function pairSplit(_sp) {
|
|||
|
|
var _ref;
|
|||
|
|
var a = _sp.split('#');
|
|||
|
|
if (a.length != 2) {
|
|||
|
|
nx.error("pairSplit失败,格式无效!", _sp);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
var k = a[0];
|
|||
|
|
var v = a[1];
|
|||
|
|
|
|||
|
|
// 如果值是数字,那么转为数字
|
|||
|
|
if (Number(v) == v) {
|
|||
|
|
v = Number(v);
|
|||
|
|
}
|
|||
|
|
return _ref = {}, _ref[k] = v, _ref;
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 特定key#value属性串转数组
|
|||
|
|
* 用于统一拆分Array[String]数据
|
|||
|
|
* @param {*} _arr
|
|||
|
|
*/
|
|||
|
|
arrPairSplit: function arrPairSplit(_arr) {
|
|||
|
|
var _this = this;
|
|||
|
|
var ret = [];
|
|||
|
|
if (this.arrEmpty(_arr)) {
|
|||
|
|
return ret;
|
|||
|
|
}
|
|||
|
|
_arr.forEach(function (_sp) {
|
|||
|
|
var d = _this.pairSplit(_sp);
|
|||
|
|
if (d) {
|
|||
|
|
ret.push(d);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return ret;
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 补零
|
|||
|
|
* @param num: 被操作数
|
|||
|
|
* @param n: 固定的总位数
|
|||
|
|
*/
|
|||
|
|
prefixZero: function prefixZero(num, n) {
|
|||
|
|
return (Array(n).join(0) + num).slice(-n);
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 字符串替换
|
|||
|
|
* replaceAll
|
|||
|
|
*/
|
|||
|
|
replace: function replace(_str, _old, _new) {
|
|||
|
|
return _str.replace(new RegExp(_old, "gm"), _new);
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:数组的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 数组
|
|||
|
|
arrGood: function arrGood(_a) {
|
|||
|
|
return Object.prototype.toString.call(_a) === "[object Array]";
|
|||
|
|
},
|
|||
|
|
// 非空数组
|
|||
|
|
arrNEmpty: function arrNEmpty(_a) {
|
|||
|
|
return this.arrGood(_a) && _a.length > 0;
|
|||
|
|
},
|
|||
|
|
// 空数组
|
|||
|
|
arrEmpty: function arrEmpty(_a) {
|
|||
|
|
return !this.arrNEmpty(_a);
|
|||
|
|
},
|
|||
|
|
// 是不是数组成员
|
|||
|
|
arrMember: function arrMember(_a, _m, _fn) {
|
|||
|
|
if (!this.arrNEmpty(_a)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
_fn = _fn || function (_v) {
|
|||
|
|
return _v == _m;
|
|||
|
|
};
|
|||
|
|
for (var i = 0; i < _a.length; ++i) {
|
|||
|
|
if (_fn(_a[i])) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
},
|
|||
|
|
// 合并数据[带关键字且不能重复]
|
|||
|
|
arrConcat: function arrConcat(_a1, _a2) {
|
|||
|
|
if (!this.arrGood(_a1) || !this.arrGood(_a2)) {
|
|||
|
|
nx.error("合并失败,参数不能为空!");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 合并Table绑定列表
|
|||
|
|
if (CC_DEBUG) {
|
|||
|
|
var _exist = function _exist(_key) {
|
|||
|
|
for (var k in _a1) {
|
|||
|
|
var m = _a1[k];
|
|||
|
|
if (m[0] == _key) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
for (var i in _a2) {
|
|||
|
|
var binder = _a2[i];
|
|||
|
|
if (_exist(binder[0])) {
|
|||
|
|
nx.error("合并失败: %s,有重复关键字项!", binder[0]);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return _a1.concat(_a2);
|
|||
|
|
},
|
|||
|
|
// 从数组中删除
|
|||
|
|
arrDelete: function arrDelete(_a, _fn, _once) {
|
|||
|
|
if (!this.arrNEmpty(_a) || !this.fnGood(_fn)) {
|
|||
|
|
return _a;
|
|||
|
|
}
|
|||
|
|
var i = _a.length;
|
|||
|
|
while (i--) {
|
|||
|
|
if (_fn(_a[i])) {
|
|||
|
|
_a.splice(i, 1);
|
|||
|
|
if (_once != false) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return _a;
|
|||
|
|
},
|
|||
|
|
// 对象转数组对
|
|||
|
|
arrFromMap: function arrFromMap(_map) {
|
|||
|
|
if (!this.objGood(_map)) {
|
|||
|
|
nx.warn("对象为空,转换失败!");
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
var pairs = [];
|
|||
|
|
for (var i in _map) {
|
|||
|
|
pairs.push([i, _map[i]]);
|
|||
|
|
}
|
|||
|
|
return pairs;
|
|||
|
|
},
|
|||
|
|
// 数组比较(成员相同)
|
|||
|
|
arrCompare: function arrCompare(_a, _b) {
|
|||
|
|
if (!this.arrGood(_a) || !this.arrGood(_b) || _a.length != _b.length) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
for (var i in _a) {
|
|||
|
|
if (!this.arrMember(_b, _a[i])) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:对象的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 创建一个UUID(运行时唯一)
|
|||
|
|
newUUID: function newUUID(_key) {
|
|||
|
|
if (!this.strNEmpty(_key)) {
|
|||
|
|
_key = "OBJ";
|
|||
|
|
}
|
|||
|
|
return _key + ++this.uuTracker;
|
|||
|
|
},
|
|||
|
|
// 创建永不重复的Tag
|
|||
|
|
newTag: function newTag(_key) {
|
|||
|
|
var tag = this.md5(cc.sys.now().toString());
|
|||
|
|
if (this.strEmpty(_key)) {
|
|||
|
|
return tag;
|
|||
|
|
}
|
|||
|
|
return _key + "." + tag;
|
|||
|
|
},
|
|||
|
|
// 空对象
|
|||
|
|
objGood: function objGood(_o) {
|
|||
|
|
return _o != null && typeof _o === "object" && Array.isArray(_o) === false;
|
|||
|
|
},
|
|||
|
|
// 非空对象
|
|||
|
|
objNEmpty: function objNEmpty(_o) {
|
|||
|
|
if (!this.objGood(_o)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return Object.keys(_o).length > 0;
|
|||
|
|
},
|
|||
|
|
// 空对象
|
|||
|
|
objEmpty: function objEmpty(_o) {
|
|||
|
|
return !this.objNEmpty(_o);
|
|||
|
|
},
|
|||
|
|
// 对象合并
|
|||
|
|
objConcat: function objConcat(_dic1, _dic2) {
|
|||
|
|
if (!this.objGood(_dic1)) {
|
|||
|
|
return this.objClone(_dic2);
|
|||
|
|
}
|
|||
|
|
if (!this.objGood(_dic1)) {
|
|||
|
|
return this.objClone(_dic1);
|
|||
|
|
}
|
|||
|
|
var dic = this.objClone(_dic1);
|
|||
|
|
for (var k in _dic2) {
|
|||
|
|
dic[k] = this.objClone(_dic2[k]);
|
|||
|
|
}
|
|||
|
|
return dic;
|
|||
|
|
},
|
|||
|
|
// 获取对象成员数量
|
|||
|
|
objLen: function objLen(_dic) {
|
|||
|
|
if (!this.objGood(_dic)) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
return Object.keys(_dic).length;
|
|||
|
|
},
|
|||
|
|
// 深复制
|
|||
|
|
objClone: function objClone(_obj) {
|
|||
|
|
// 非对象直接使用返回
|
|||
|
|
if (!_obj || typeof _obj !== "object") {
|
|||
|
|
return _obj;
|
|||
|
|
}
|
|||
|
|
var out = _obj.constructor === Array ? [] : {};
|
|||
|
|
var _clone = function _clone(o, c) {
|
|||
|
|
for (var i in o) {
|
|||
|
|
if (o[i] && typeof o[i] === "object") {
|
|||
|
|
if (o[i].constructor === Array) {
|
|||
|
|
c[i] = [];
|
|||
|
|
} else {
|
|||
|
|
c[i] = {};
|
|||
|
|
}
|
|||
|
|
_clone(o[i], c[i]);
|
|||
|
|
} else {
|
|||
|
|
c[i] = o[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return c;
|
|||
|
|
};
|
|||
|
|
return _clone(_obj, out);
|
|||
|
|
},
|
|||
|
|
// 复制属性到对象
|
|||
|
|
copyProperties: function copyProperties(_object, _dic, _log) {
|
|||
|
|
if (_log === void 0) {
|
|||
|
|
_log = false;
|
|||
|
|
}
|
|||
|
|
if (!this.objGood(_object) || !this.objGood(_dic)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (_log) {
|
|||
|
|
nx.debug("[DT]属性更新:");
|
|||
|
|
}
|
|||
|
|
for (var k in _dic) {
|
|||
|
|
_object[k] = this.objClone(_dic[k]);
|
|||
|
|
if (_log) {
|
|||
|
|
nx.debug("\t\t键值: %s", k);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:随机数的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 范围随机数
|
|||
|
|
randomRange: function randomRange(_min, _max) {
|
|||
|
|
var Range = _max - _min;
|
|||
|
|
var Rand = Math.random();
|
|||
|
|
var num = _min + Math.round(Rand * Range); //四舍五入
|
|||
|
|
return num;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:加密的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 获取md5
|
|||
|
|
md5: function md5(key) {
|
|||
|
|
return md.hex_md5(key);
|
|||
|
|
},
|
|||
|
|
// 加密
|
|||
|
|
encode64: function encode64(str, pwd) {
|
|||
|
|
str = Base64.encode(str); //Base64加密
|
|||
|
|
var prand = "";
|
|||
|
|
for (var i = 0; i < pwd.length; i++) {
|
|||
|
|
prand += pwd.charCodeAt(i).toString();
|
|||
|
|
}
|
|||
|
|
var sPos = Math.floor(prand.length / 5);
|
|||
|
|
var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
|
|||
|
|
var incr = Math.ceil(pwd.length / 2);
|
|||
|
|
var modu = Math.pow(2, 31) - 1;
|
|||
|
|
if (mult < 2) {
|
|||
|
|
alert("Please choose a more complex or longer password.");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
var salt = Math.round(Math.random() * 1000000000) % 100000000;
|
|||
|
|
prand += salt;
|
|||
|
|
while (prand.length > 10) {
|
|||
|
|
prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
|
|||
|
|
}
|
|||
|
|
prand = (mult * prand + incr) % modu;
|
|||
|
|
var enc_chr = "";
|
|||
|
|
var enc_str = "";
|
|||
|
|
for (var i = 0; i < str.length; i++) {
|
|||
|
|
enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor(prand / modu * 255));
|
|||
|
|
if (enc_chr < 16) {
|
|||
|
|
enc_str += "0" + enc_chr.toString(16);
|
|||
|
|
} else enc_str += enc_chr.toString(16);
|
|||
|
|
prand = (mult * prand + incr) % modu;
|
|||
|
|
}
|
|||
|
|
salt = salt.toString(16);
|
|||
|
|
while (salt.length < 8) salt = "0" + salt;
|
|||
|
|
enc_str += salt;
|
|||
|
|
return enc_str;
|
|||
|
|
},
|
|||
|
|
// 解密
|
|||
|
|
decode64: function decode64(str, pwd) {
|
|||
|
|
var prand = "";
|
|||
|
|
for (var i = 0; i < pwd.length; i++) {
|
|||
|
|
prand += pwd.charCodeAt(i).toString();
|
|||
|
|
}
|
|||
|
|
var sPos = Math.floor(prand.length / 5);
|
|||
|
|
var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
|
|||
|
|
var incr = Math.round(pwd.length / 2);
|
|||
|
|
var modu = Math.pow(2, 31) - 1;
|
|||
|
|
var salt = parseInt(str.substring(str.length - 8, str.length), 16);
|
|||
|
|
str = str.substring(0, str.length - 8);
|
|||
|
|
prand += salt;
|
|||
|
|
while (prand.length > 10) {
|
|||
|
|
prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
|
|||
|
|
}
|
|||
|
|
prand = (mult * prand + incr) % modu;
|
|||
|
|
var enc_chr = "";
|
|||
|
|
var enc_str = "";
|
|||
|
|
for (var i = 0; i < str.length; i += 2) {
|
|||
|
|
enc_chr = parseInt(parseInt(str.substring(i, i + 2), 16) ^ Math.floor(prand / modu * 255));
|
|||
|
|
enc_str += String.fromCharCode(enc_chr);
|
|||
|
|
prand = (mult * prand + incr) % modu;
|
|||
|
|
}
|
|||
|
|
return Base64.decode(enc_str);
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:JSON
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 安全执行(异常捕获)
|
|||
|
|
trycatch: function trycatch(_dosth, _error) {
|
|||
|
|
try {
|
|||
|
|
_dosth();
|
|||
|
|
} catch (e) {
|
|||
|
|
nx.error("[异常]:" + (e ? e.message + "\n" + e.stack : "未知错误!"));
|
|||
|
|
if (_error) {
|
|||
|
|
_error(e);
|
|||
|
|
}
|
|||
|
|
if (e && cc.sys.isNative && window && window.__errorHandler) {
|
|||
|
|
window.__errorHandler(e.message, "", "", e.stack);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// JSON压缩
|
|||
|
|
enjson: function enjson(_object) {
|
|||
|
|
try {
|
|||
|
|
return JSON.stringify(_object);
|
|||
|
|
} catch (e) {
|
|||
|
|
nx.error("[异常]:" + (e ? e.message + "\n" + e.stack : "未知错误!"));
|
|||
|
|
// if( e && cc.sys.isNative && window && window.__errorHandler ) {
|
|||
|
|
// window.__errorHandler( e.message, "", "", e.stack );
|
|||
|
|
// }
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// JSON解析
|
|||
|
|
dejson: function dejson(_str) {
|
|||
|
|
// 空返回
|
|||
|
|
if (!this.strNEmpty(_str)) {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
return JSON.parse(_str);
|
|||
|
|
} catch (e) {
|
|||
|
|
nx.error("[异常]:" + (e ? e.message + "\n" + e.stack : "未知错误!"));
|
|||
|
|
// if( e && cc.sys.isNative && window && window.__errorHandler ) {
|
|||
|
|
// window.__errorHandler( e.message, "", "", e.stack );
|
|||
|
|
// }
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:时间的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 秒级时间戳
|
|||
|
|
timeStamp: function timeStamp() {
|
|||
|
|
return Math.floor(cc.sys.now() / 1000);
|
|||
|
|
},
|
|||
|
|
// 格式化日期
|
|||
|
|
fmtDate: function fmtDate(_date, _year) {
|
|||
|
|
if (_year === void 0) {
|
|||
|
|
_year = true;
|
|||
|
|
}
|
|||
|
|
_date = _date ? _date : new Date();
|
|||
|
|
if (this.numGood(_date)) {
|
|||
|
|
_date = new Date(_date);
|
|||
|
|
}
|
|||
|
|
var _format = function _format(v) {
|
|||
|
|
return v < 10 ? "0" + v : v;
|
|||
|
|
};
|
|||
|
|
if (!_year) {
|
|||
|
|
return nx.text.formatS("%s:%s", _format(_date.getMonth() + 1), _format(_date.getDate()));
|
|||
|
|
}
|
|||
|
|
return nx.text.formatS("%s-%s-%s", _format(_date.getFullYear()), _format(_date.getMonth() + 1), _format(_date.getDate()));
|
|||
|
|
},
|
|||
|
|
// 格式化日期
|
|||
|
|
fmtDateLoc: function fmtDateLoc(_date, _year) {
|
|||
|
|
if (_year === void 0) {
|
|||
|
|
_year = true;
|
|||
|
|
}
|
|||
|
|
_date = _date ? _date : new Date();
|
|||
|
|
if (!_year) {
|
|||
|
|
return nx.text.formatS("%s%s", nx.text.format("month", _date.getMonth() + 1), nx.text.format("day", _date.getDate()));
|
|||
|
|
}
|
|||
|
|
return nx.text.formatS("%s%s%s", nx.text.format("year", _date.getFullYear()), nx.text.format("month", _date.getMonth() + 1), nx.text.format("day", _date.getDate()));
|
|||
|
|
},
|
|||
|
|
// 格式化时间
|
|||
|
|
fmtTime: function fmtTime(_date) {
|
|||
|
|
_date = _date ? _date : new Date();
|
|||
|
|
var _format = function _format(v) {
|
|||
|
|
return v < 10 ? "0" + v : v;
|
|||
|
|
};
|
|||
|
|
return nx.text.formatS("%s:%s:%s", _format(_date.getHours()), _format(_date.getMinutes()), _format(_date.getSeconds()));
|
|||
|
|
},
|
|||
|
|
// 格式化时间
|
|||
|
|
fmtTimeFromSecs: function fmtTimeFromSecs(_secs, _full) {
|
|||
|
|
if (_full === void 0) {
|
|||
|
|
_full = false;
|
|||
|
|
}
|
|||
|
|
if (!this.numPositive(_secs, false)) {
|
|||
|
|
return _full ? "00:00:00" : "00:00";
|
|||
|
|
}
|
|||
|
|
var f = function f(v) {
|
|||
|
|
return v < 10 ? "0" + v : v;
|
|||
|
|
};
|
|||
|
|
var h = Math.floor(_secs / 3600);
|
|||
|
|
_secs = _secs % 3600;
|
|||
|
|
var m = Math.floor(_secs / 60);
|
|||
|
|
var s = Math.floor(_secs % 60);
|
|||
|
|
|
|||
|
|
// 完整版本
|
|||
|
|
if (_full) {
|
|||
|
|
return nx.text.formatS("%s:%s:%s", f(h), f(m), f(s));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 时:分:秒
|
|||
|
|
if (h > 0) {
|
|||
|
|
return nx.text.formatS("%d:%s:%s", h, f(m), f(s));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 分:秒
|
|||
|
|
if (m > 0) {
|
|||
|
|
return nx.text.formatS("%s:%s", f(m), f(s));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 秒
|
|||
|
|
return '00:' + f(s);
|
|||
|
|
},
|
|||
|
|
// 计算剩余天数(向上取整)
|
|||
|
|
// _ts: 秒级时间戳
|
|||
|
|
getDaysFromNow: function getDaysFromNow(_ts) {
|
|||
|
|
var secs = Math.max(0, _ts - cc.sys.now() / 1000);
|
|||
|
|
var days = Math.ceil(secs / (24 * 3600));
|
|||
|
|
return days;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:URL的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 格式化URL
|
|||
|
|
formatURL: function formatURL(_url, _args) {
|
|||
|
|
if (!this.strNEmpty(_url)) {
|
|||
|
|
nx.error("WebTask:URL参数不能为空!");
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
if (!this.objGood(_args)) {
|
|||
|
|
return encodeURI(_url);
|
|||
|
|
}
|
|||
|
|
var aline = "";
|
|||
|
|
for (var k in _args) {
|
|||
|
|
aline += aline == "" ? "?" : "&";
|
|||
|
|
var v = _args[k];
|
|||
|
|
var o = this.objGood(v) || this.arrGood(v);
|
|||
|
|
aline += k + "=" + (o ? nx.dt.enjson(v) : v);
|
|||
|
|
}
|
|||
|
|
return encodeURI(_url + aline);
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:数量方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 数量千分化
|
|||
|
|
* @param {*} _count : 数量
|
|||
|
|
* @param {*} _pn : 小数位数
|
|||
|
|
* @returns
|
|||
|
|
*/
|
|||
|
|
fmtCount: function fmtCount(_count, _pn) {
|
|||
|
|
if (!nx.dt.numPositive(_pn) || _pn < 0 || _pn > 20) {
|
|||
|
|
_pn = DefPN;
|
|||
|
|
}
|
|||
|
|
_count = parseFloat((_count + "").replace(/[^\d\.-]/g, "")).toFixed(_pn) + "";
|
|||
|
|
var l = _count.split(".")[0].split("").reverse();
|
|||
|
|
var r = _count.split(".")[1];
|
|||
|
|
var t = "";
|
|||
|
|
for (var i = 0; i < l.length; i++) {
|
|||
|
|
t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
|
|||
|
|
}
|
|||
|
|
if (r) {
|
|||
|
|
var ret = t.split("").reverse().join("") + "." + r;
|
|||
|
|
} else {
|
|||
|
|
var ret = t.split("").reverse().join("");
|
|||
|
|
}
|
|||
|
|
if ((ret.charAt(0) == "-" || ret.charAt(0) == "+") && ret.charAt(1) == ",") {
|
|||
|
|
ret = ret.charAt(0) + ret.slice(2);
|
|||
|
|
}
|
|||
|
|
return ret;
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 数量简化
|
|||
|
|
* @param {*} _count 数量
|
|||
|
|
* @param {*} _sdd 强制+号
|
|||
|
|
* @param {*} _pn 小数位数
|
|||
|
|
* @param {*} _trimZero 忽略尾部0
|
|||
|
|
* @returns
|
|||
|
|
*/
|
|||
|
|
shortCount: function shortCount(_count, _sdd, _pn, _trimZero) {
|
|||
|
|
if (_sdd === void 0) {
|
|||
|
|
_sdd = false;
|
|||
|
|
}
|
|||
|
|
if (_pn === void 0) {
|
|||
|
|
_pn = 2;
|
|||
|
|
}
|
|||
|
|
if (_trimZero === void 0) {
|
|||
|
|
_trimZero = true;
|
|||
|
|
}
|
|||
|
|
// 转数字
|
|||
|
|
_count = parseInt(_count);
|
|||
|
|
if (!this.numGood(_count)) {
|
|||
|
|
_count = 0;
|
|||
|
|
}
|
|||
|
|
var lessZero = false;
|
|||
|
|
if (_count < 0) {
|
|||
|
|
lessZero = true;
|
|||
|
|
_count *= -1;
|
|||
|
|
}
|
|||
|
|
if (!this.numPositive(_pn)) {
|
|||
|
|
_pn = DefPN;
|
|||
|
|
}
|
|||
|
|
var value = "";
|
|||
|
|
var unitKey = "";
|
|||
|
|
|
|||
|
|
// 国际通用KM小数点后保留2位来展示
|
|||
|
|
// 小于1K
|
|||
|
|
// if( _count < 1000 ) {
|
|||
|
|
if (_count < 100000000) {
|
|||
|
|
value = "" + this.toFixedDecimal(_count);
|
|||
|
|
if (!_trimZero) {
|
|||
|
|
value = this.fmtCount(value, _pn);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// // 1M > _count >= 1K
|
|||
|
|
// else if( _count >= 1000 && _count < 1000000 ) {
|
|||
|
|
// value = this.toFixedDecimal( _count / 1000 ).toFixed( _pn );
|
|||
|
|
// unitKey = "K";
|
|||
|
|
// }
|
|||
|
|
// 1B > _count >= 1M
|
|||
|
|
else if (_count >= 100000000 && _count < 1000000000) {
|
|||
|
|
value = this.toFixedDecimal(_count / 1000000).toFixed(_pn);
|
|||
|
|
unitKey = "M";
|
|||
|
|
}
|
|||
|
|
// >= 1B
|
|||
|
|
else {
|
|||
|
|
value = this.toFixedDecimal(_count / 1000000000).toFixed(_pn);
|
|||
|
|
unitKey = "B";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 末尾0忽略
|
|||
|
|
if (_trimZero) {
|
|||
|
|
value = Number(value) + unitKey;
|
|||
|
|
} else {
|
|||
|
|
value += unitKey;
|
|||
|
|
}
|
|||
|
|
if (lessZero) {
|
|||
|
|
value = "-" + value;
|
|||
|
|
} else {
|
|||
|
|
if (_sdd === true) {
|
|||
|
|
value = "+" + value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return value;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:WEB参数解析
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 获取URL网址参数
|
|||
|
|
parseURLArgs: function parseURLArgs() {
|
|||
|
|
var theRequest = {};
|
|||
|
|
|
|||
|
|
// 非浏览器不处理
|
|||
|
|
if (!cc.sys.isBrowser || !location) {
|
|||
|
|
return theRequest;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取url中"?"符后的字串
|
|||
|
|
var url = location.search;
|
|||
|
|
if (url.indexOf("?") != -1) {
|
|||
|
|
var str = url.substr(1);
|
|||
|
|
var strs = str.split("&");
|
|||
|
|
for (var i = 0; i < strs.length; i++) {
|
|||
|
|
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return theRequest;
|
|||
|
|
},
|
|||
|
|
// 针对URL不正规的参数解析
|
|||
|
|
queryURLArg: function queryURLArg(_key) {
|
|||
|
|
// 非浏览器不处理
|
|||
|
|
if (!cc.sys.isBrowser || !window.location) {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
var reg = new RegExp('(^|&)' + _key + '=([^&]*)(&|$)', 'i');
|
|||
|
|
var serach = '';
|
|||
|
|
if (window.location.search.length > 0) {
|
|||
|
|
serach = window.location.search.substr(1);
|
|||
|
|
} else {
|
|||
|
|
serach = window.location.href.split('?')[1] ? window.location.href.split('?')[1] : '';
|
|||
|
|
}
|
|||
|
|
var r = serach.match(reg);
|
|||
|
|
if (r != null) {
|
|||
|
|
return unescape(r[2]);
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
},
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
// 方法集:距离的方法
|
|||
|
|
// ------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 格式化距离
|
|||
|
|
formatDistance: function formatDistance(_meters) {
|
|||
|
|
if (typeof _meters != "number") {
|
|||
|
|
return nx.text.format("distance_none");
|
|||
|
|
}
|
|||
|
|
if (_meters < 1000) {
|
|||
|
|
return nx.text.format("distance_m", _meters);
|
|||
|
|
}
|
|||
|
|
var km = Math.floor(_meters / 1000);
|
|||
|
|
return nx.text.format("distance_km", km);
|
|||
|
|
},
|
|||
|
|
// 文件大小字节转K,M,G
|
|||
|
|
formatFileSize: function formatFileSize(_size) {
|
|||
|
|
if (!_size) {
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
var num = 1024.00; //byte
|
|||
|
|
|
|||
|
|
if (_size < num) return _size + "B";
|
|||
|
|
if (_size < Math.pow(num, 2)) return (_size / num).toFixed(2) + "K"; //kb
|
|||
|
|
if (_size < Math.pow(num, 3)) return (_size / Math.pow(num, 2)).toFixed(2) + "M"; //M
|
|||
|
|
if (_size < Math.pow(num, 4)) return (_size / Math.pow(num, 3)).toFixed(2) + "G"; //G
|
|||
|
|
return (_size / Math.pow(num, 4)).toFixed(2) + "T"; //T
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 检测账号是否包含中文
|
|||
|
|
formatAccount: function formatAccount(str) {
|
|||
|
|
if (typeof str !== 'string') {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//去除字符串的左右两边空格
|
|||
|
|
//+表示匹配一次或多次,|表示或者,\s和\u00A0匹配空白字符,/^以……开头,$以……结尾,/g全局匹配,/i忽略大小写
|
|||
|
|
str = (str || "").replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, "");
|
|||
|
|
//匹配中文,match返回包含中文的数组
|
|||
|
|
var chinese = str.match(/[\u4e00-\u9fa5]/g);
|
|||
|
|
//计算字符个数
|
|||
|
|
return !!chinese;
|
|||
|
|
},
|
|||
|
|
// 检测姓名是否是中文
|
|||
|
|
formatChineseName: function formatChineseName(str) {
|
|||
|
|
if (str.length <= 1) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var re = /[^\u4e00-\u9fa5]/;
|
|||
|
|
return !re.test(str);
|
|||
|
|
},
|
|||
|
|
// 随机字符串生成
|
|||
|
|
randomStr: function randomStr(min, max, strRange) {
|
|||
|
|
var rd = function rd(_l, _r) {
|
|||
|
|
if (_r > _l) {
|
|||
|
|
return Math.round(Math.random() * (_r - _l)) + _l;
|
|||
|
|
} else {
|
|||
|
|
return _l;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var str = "";
|
|||
|
|
strRange = strRange || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|||
|
|
var n = rd(min, max);
|
|||
|
|
var len = strRange.length;
|
|||
|
|
for (var i = 0; i < n; i++) {
|
|||
|
|
var pos = rd(1, len) - 1;
|
|||
|
|
str += strRange.charAt(pos);
|
|||
|
|
}
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 模块导出
|
|||
|
|
module.exports = NxMath;
|
|||
|
|
|
|||
|
|
cc._RF.pop();
|