前言

这是我的私人代码收集库,当前这篇是 JavaScript 的。

格式化类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* 格式化金额数字
* number {Number} 待格式化的数字
* fix {Number} 需要保留的小数点位数
* unit {String} 单位
* txt {String} 数字为0时显示的文字
* symbol {String} 分割符号
* return {String} 格式化好的字符串
*/
fmtMoney: function (number, fix, unit, txt, symbol) {
// 处理默认值
fix = fix || 2;
unit = unit || '';
txt = txt || '--';
symbol = symbol || ',';

var floatNum = parseFloat(number);
// 处理不合法输入
if (floatNum === NaN) {
console.error('fmtMoney: 待格式化数据(' + number + ')不是数字');
return;
}
// 处理数字为0时输出
if (floatNum === 0) return txt || '';
// 分割数字
var strNum = String(number);
var numParts = strNum.split('.');
var intPart = numParts[0];
var decPart = numParts[1] || '';
// 处理整数位
intPart = intPart.replace(/(\d)(?=(\d{3})+$)/g, '$1' + symbol);
// 处理小数位
if (decPart.length < fix) {
var zeros = new Array(fix - decPart.length + 1).join('0');
decPart = decPart + zeros;
} else {
decPart = decPart.substr(0, fix);
}
return intPart + '.' + decPart + unit;
}

拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* Clone a JavaScript target
* @param {any} obj Target to be clone
* @param {boolean} isDeep Enable deep clone
* @param {Map} _stack Private param, no need to pass
* @returns {any} A copy of target
*/
export default function clone(obj, isDeep = false, _stack = new Map()) {
if (_stack.has(obj)) {
return _stack.get(obj)
}
if (Array.isArray(obj)) {
return obj.map(item => isDeep ? clone(item, true, _stack) : item)
}
if (obj == null) {
return obj === undefined ? undefined : null
}
if (obj instanceof Map) {
const result = new obj.constructor()
obj.forEach((val, key) => result.set(key, isDeep ? clone(val, true, _stack) : val))
return result
}
if (obj instanceof Set) {
const result = new obj.constructor()
obj.forEach((val) => result.add(isDeep ? clone(val, true, _stack) : val))
return result
}

const type = Object.prototype.toString.call(obj).slice(8, -1)
if (type === 'Date' || type === 'RegExp') {
return new obj.constructor(obj)
}
if (typeof obj === 'object' && (type === 'String' || type === 'Number')) {
return new obj.constructor(obj)
}
if (type === 'Function') {
const rt = function () { return obj.apply(this, arguments) }
Object.getOwnPropertyNames(obj).forEach(key => {
const pd = Object.getOwnPropertyDescriptor(obj, key)
if (isDeep) {
pd.value = clone(obj[key], true, _stack)
}
Object.defineProperty(rt, key, pd)
})
Object.assign(rt.prototype, obj.prototype)
return rt
}
if (type === 'Object') {
const rt = {}
Object.getOwnPropertyNames(obj).forEach(key => {
const pd = Object.getOwnPropertyDescriptor(obj, key)
if (isDeep) {
pd.value = clone(obj[key], true, _stack)
}
Object.defineProperty(rt, key, pd)
})
return rt
}
return obj
}

正则表达式匹配科学计数法数字

1
2
3
4
5
6
7
8
9
10
11
const reg = /^\d+(?:\.\d+)?(?:[eE]\-?\d+)?$/

reg.test("2") // true
reg.test("2.1") // true
reg.test("2.") // false
reg.test("2e2") // true
reg.test("2.1E2") // true
reg.test("2E-2") // true
reg.test("2.1e-2") // true
reg.test("123.456e-789") // true
reg.test("123.456e-78.9") // false