app-base-web
Version:
web development common base package.
281 lines (274 loc) • 7.59 kB
JavaScript
/**
* @module number
*/
module.exports = {
/**
* 随机数范围
*
* @param {number} min - 最小值
* @param {number} max - 最大值
* @return {number} 返回随机数
*/
random: function (min, max) {
if (arguments.length === 2) {
return Math.floor(min + Math.random() * ((max + 1) - min))
} else {
return null;
}
},
/**
* 抽奖概率
*
* @param {array} goods - 奖品池,如:['一等奖','二等奖']
* @param {array} odds - 概率数组,如:[0.1.0.9]
* @returns {*} 返回随机元素
*/
randomGoods: function (goods, odds) {
let sum = 0,
factor = 0,
random = Math.random();
for (let i = odds.length - 1; i >= 0; i--) {
sum += odds[i]; // 统计概率总和
};
random *= sum; // 生成概率随机数
for (let i = odds.length - 1; i >= 0; i--) {
factor += odds[i];
if (random <= factor) return goods[i];
};
return null;
},
/**
* 随机验证码
*
* @param {number} len - 长度
* @return {number} 返回验证码
*/
randomCode: function (len) {
var code = ''
const random = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for (let i = 0; i < len; i++) {
let index = Math.floor(Math.random() * 10);
code += random[index];
}
return code
},
/**
* 将数字转换成对应的中文小写
*
* @param num {number} 数字
* @return {string} 返回中文小写
*/
formatSmallChinese: function (num) {
let AA = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"];
let BB = ["", "十", "百", "仟", "萬", "億", "点", ""];
let a = ("" + num).replace(/(^0*)/g, "").split("."),
k = 0,
re = "";
for (let i = a[0].length - 1; i >= 0; i--) {
switch (k) {
case 0:
re = BB[7] + re;
break;
case 4:
if (!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$")
.test(a[0]))
re = BB[4] + re;
break;
case 8:
re = BB[5] + re;
BB[7] = BB[5];
k = 0;
break;
default:
return false
}
if (k % 4 === 2 && a[0].charAt(i + 2) !== 0 && a[0].charAt(i + 1) === 0)
re = AA[0] + re;
if (a[0].charAt(i) !== 0)
re = AA[a[0].charAt(i)] + BB[k % 4] + re;
k++;
}
if (a.length > 1) // 加上小数部分(如果有小数部分)
{
re += BB[6];
for (let i = 0; i < a[1].length; i++)
re += AA[a[1].charAt(i)];
}
if (re === '一十')
re = "十";
if (re.match(/^一/) && re.length === 3)
re = re.replace("一", "");
return re;
},
/**
* 数字金钱表示
*
* @param num {number} 数字
* @return {string} 返回金钱表示
*/
formatMoney: function (num) {
let str = num.toString()
let newStr = "";
let count = 0;
if (str.indexOf(".") === -1) {
for (let i = str.length - 1; i >= 0; i--) {
if (count % 3 === 0 && count !== 0) {
newStr = str.charAt(i) + "," + newStr;
} else {
newStr = str.charAt(i) + newStr;
}
count++;
}
str = newStr + ".00"; //自动补小数点后两位
return str
} else {
for (let i = str.indexOf(".") - 1; i >= 0; i--) {
if (count % 3 === 0 && count !== 0) {
newStr = str.charAt(i) + "," + newStr; //碰到3的倍数则加上“,”号
} else {
newStr = str.charAt(i) + newStr; //逐个字符相接起来
}
count++;
}
str = newStr + (str + "00").substr((str + "00").indexOf("."), 3);
return str
}
},
/**
* 中文大写金钱表示
*
* @param money {number|string}
* @return {string} 返回中文大写金钱表示
*/
formatBigMoney: function (money) {
//汉字的数字
var cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
//基本单位
var cnIntRadice = ['', '拾', '佰', '仟'];
//对应整数部分扩展单位
var cnIntUnits = ['', '万', '亿', '兆'];
//对应小数部分单位
var cnDecUnits = ['角', '分', '毫', '厘'];
//整数金额时后面跟的字符
var cnInteger = '整';
//整型完以后的单位
var cnIntLast = '元';
//最大处理的数字
var maxNum = 999999999999999.9999;
//金额整数部分
var integerNum;
//金额小数部分
var decimalNum;
//输出的中文金额字符串
var chineseStr = '';
//分离金额后用的数组,预定义
var parts;
if (money === '') { return ''; }
money = parseFloat(money);
if (money >= maxNum) {
//超出最大处理数字
return '';
}
if (money === 0) {
chineseStr = cnNums[0] + cnIntLast + cnInteger;
return chineseStr;
}
//转换为字符串
money = money.toString();
if (money.indexOf('.') === -1) {
integerNum = money;
decimalNum = '';
} else {
parts = money.split('.');
integerNum = parts[0];
decimalNum = parts[1].substr(0, 4);
}
//获取整型部分转换
if (parseInt(integerNum, 10) > 0) {
var zeroCount = 0;
var IntLen = integerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = integerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n === '0') {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
//归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m === 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q];
}
}
chineseStr += cnIntLast;
}
//小数部分
if (decimalNum !== '') {
let decLen = decimalNum.length;
for (let i = 0; i < decLen; i++) {
let n = decimalNum.substr(i, 1);
if (n !== '0') {
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (chineseStr === '') {
chineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (decimalNum === '') {
chineseStr += cnInteger;
}
return chineseStr;
},
/**
* 数字单位
*
* @param num {number}
* @return {string} 返回数字单位
*/
numberUnit: function (num) {
switch (true) {
case num > 999999999:
return `${(num / 1000000000).toFixed(2)} 十亿`
case num > 99999999:
return `${(num / 100000000).toFixed(2)} 亿`
case num > 9999999:
return `${(num / 10000000).toFixed(2)} 千万`
case num > 999999:
return `${(num / 1000000).toFixed(2)} 百万`
case num > 99999:
return `${(num / 100000).toFixed(2)} 十万`
case num > 9999:
return `${(num / 10000).toFixed(2)} 万`
default:
return num
}
},
toNum: function (s) {
return Number(s);
},
toMoney: function (s) {
return s.replace(/[^\d\.-]/g, "");
},
/**金额 用逗号 隔开。数字格式化
* s :被个是字符串
* n:保留小数位
*/
formatMoney: function (s, n) {
if (!n) n = 2;
n = n > 0 && n <= 20 ? n : 2;
s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
var l = s.split(".")[0].split("").reverse(),
r = s.split(".")[1];
t = "";
for (i = 0; i < l.length; i++) {
t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
}
return t.split("").reverse().join("") + "." + r;
},
}