halo-util
Version:
前端模块化 JavaScript 工具库
432 lines (407 loc) • 12.3 kB
JavaScript
;
/**
* 去除字符串前后位置空格
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function trim(value) {
return value.replace(/(^\s*)|(\s*$)/g, "");
}
/**
* 去除字符串开始位置的空格
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function trimStart(value) {
return value.replace(/(^\s*)/g, "");
}
/**
* 去除字符串结束位置的空格
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function trimEnd(value) {
return value.replace(/(\s*$)/g, "");
}
/**
* 去除字符串中全部的空格
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function trimAll(value) {
return value.replace(/\s+/g, "");
}
/**
* 替换所有指定字符串为新的字符串
* @param {String} value 参数
* @param {String} oldSubstr 需要替换的字符串
* @param {String} newSubstr 替换后的字符串
* @returns {String} 返回处理后的字符串
*/
function replaceAll(value, oldSubstr, newSubstr) {
return value.replace(new RegExp(oldSubstr, "gm"), newSubstr);
}
/* 字符串转换 */
/**
* 字符串转大写
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toUpper(value) {
return String(value).toLocaleUpperCase();
}
/**
* 字符串转小写
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toLower(value) {
String(value).toLocaleLowerCase();
}
/**
* 转为 snake_case 下划线命名
* @description 支持 驼峰命名,短横命名,帕斯卡命名
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toSnakeCase(value) {
// 驼峰
if (/^[a-z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
return value.replace(/([A-Z])/g, "_$1").toLowerCase();
}
// 短横
if (value.indexOf("-") > 0) {
return value.replace(/-/g, "_").toLowerCase();
}
// 帕斯卡
if (/^[A-Z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
value = value.charAt(0).toLowerCase() + value.slice(1);
return value.replace(/([A-Z])/g, "_$1").toLowerCase();
}
}
/**
* 转为 kebab-case 短横命名
* @description 支持 下划线,驼峰命名,帕斯卡命名
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toKebabCase(value) {
// 下划线
if (value.indexOf("_") > 0) {
return value.replace(/_/g, "-").toLowerCase();
}
// 驼峰
if (/^[a-z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
return value.replace(/([A-Z])/g, "-$1").toLowerCase();
}
// 帕斯卡
if (/^[A-Z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
let newStr = value.charAt(0).toLowerCase() + value.slice(1);
return newStr.replace(/([A-Z])/g, "-$1").toLowerCase();
}
}
/**
* 转为 camelCase 驼峰命名
* @description 支持 下划线命名,短横命名,帕斯卡命名
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toCamelCase(value) {
// 下划线
if (value.indexOf("_") > 0) {
return value.replace(/\_(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
}
// 短横
else if (value.indexOf("-") > 0) {
return value.replace(/\-(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
}
// 帕斯卡
else if (/^[A-Z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
return value.charAt(0).toLowerCase() + value.slice(1);
}
// 返回自身
else {
return value;
}
}
/**
* 转为 PascalCase 帕斯卡命名
* @description 支持 下划线命名,短横命名,驼峰命名
* @param {String} value 参数
* @returns {String} 返回处理后的字符串
*/
function toPascalCase(value) {
// 下划线
if (value.indexOf("_") > 0) {
let newStr = value.replace(/\_(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
return newStr.charAt(0).toUpperCase() + newStr.slice(1);
}
// 短横
else if (value.indexOf("-") > 0) {
let newStr = value.replace(/\-(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
return newStr.charAt(0).toUpperCase() + newStr.slice(1);
}
// 驼峰
else if (/^[a-z]$/.test(value.charAt(0)) && !(value.indexOf("-") > 0 || value.indexOf("_") > 0)) {
return value.charAt(0).toUpperCase() + value.slice(1);
}
// 返回自身
else {
return value;
}
}
/* 字符串加密 */
/**
* base64 加密
* @param {String} str 字符串
* @returns {String} 返回加密后的字符串
*/
function encode(str) {
return window.btoa(str);
}
/**
* base64 解密
* @param {String} str 字符串
* @returns {String} 返回解密后的字符串
*/
function decode(str) {
return window.atob(str);
}
/* 字符串格式化 */
/**
* 字符串中是否包含指定的元素
* @param {String} value 包含的元素
* @param {String} str 查找的字符串
* @returns {Boolean} 返回true和false
*/
function inString(value, str) {
return str.includes(value);
}
/**
* 数字前补齐0达到指定位数
* @description 相当于原生的 padStart(2,'0')
* @param {Number|String} value 补零的数字
* @param {Number} maxLength 补齐0后的最大长度,默认2位
* @returns {String} 返回补0后指定位数的字符串
*/
function zeroStart(value, maxLength = 2) {
let len = value.toString().length;
while (len < maxLength) {
value = "0" + value;
len++;
}
return value;
}
/**
* 数字后补齐0达到指定位数
* @description 相当于原生的 padEnd(2,'0')
* @param {Number|String} value 补零的数字
* @param {Number} maxLength 补齐0后的最大长度,默认2位
* @returns {String} 返回补0后指定位数的字符串
*/
function zeroEnd(value, maxLength = 2) {
let len = value.toString().length;
while (len < maxLength) {
value = value + "0";
len++;
}
return value;
}
/**
* 格式化千分位数字
* @description 支持任意数据传参,如果非数字则不会格式化,并返回原数据
* @param {Number|String} num 数字
* @returns {String} 返回格式化后的千分位数字
*/
function formatThousand(num) {
if (!parseFloat(num)) return num;
num = String(num);
let regex = num.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g;
return num.replace(regex, "$1,");
}
/**
* 格式化人民币金额大写
* @param {Number|String} money 金额
* @returns {String} 返回金额大写
*/
function formatRmbChinese(money) {
// 汉字的数字
let cnNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
// 基本单位
let cnIntRadiance = ["", "拾", "佰", "仟"];
// 对应整数部分扩展单位
let cnIntUnits = ["", "万", "亿", "兆"];
// 对应小数部分单位
let cnDecUnits = ["角", "分", "毫", "厘"];
// 整数金额时后面跟的字符
let cnInteger = "整";
// 整型完以后的单位
let cnIntLast = "元";
// 最大处理的数字
let maxNum = Number("999999999999999.9999");
// 金额整数部分
let integerNum;
// 金额小数部分
let decimalNum;
// 输出的中文金额字符串
let chineseStr = "";
// 分离金额后用的数组,预定义
let parts;
if (money === "") {
// 不能用==
return "";
}
money = parseFloat(money);
if (money >= maxNum) {
// 超出最大处理数字,抛出异常
throw new Error("Calculated number overflow!");
}
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) {
let zeroCount = 0;
let IntLen = integerNum.length;
for (let i = 0; i < IntLen; i++) {
let n = integerNum.substr(i, 1);
let p = IntLen - i - 1;
let q = p / 4;
let m = p % 4;
if (n === "0") {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
// 归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadiance[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 {String} value 姓名
* @returns {String} 返回转化后字符串
*/
function formatStartOfName(value) {
if (value.length === 2) {
return _formatStartOf(value, 1, 1);
} else if (value.length > 2) {
return _formatStartOf(value, 1, value.length - 2);
} else {
return value;
}
}
/**
* 手机号码固定位数转为星号
* @param {String} value 手机号码
* @param {Number} start 前缀长度,默认3位
* @param {Number} len 显示星号的长度,默认4位
* @returns {String} 返回转化后字符串
*/
function formatStartOfMobile(value, start = 3, len = 4) {
return _formatStartOf(value, start, len);
}
/**
* 身份证号码固定位数转为星号
* @param {String} value 身份证号码
* @param {Number} start 前缀长度,默认4位
* @param {Number} len 显示星号的长度,默认8位
* @returns {String} 返回转化后字符串
*/
function formatStartOfIdCard(value, start = 4, len = 8) {
return _formatStartOf(value, start, len);
}
/**
* 银行卡号固定位数转为星号
* @param {String} value 银行卡号
* @param {Number} start 前缀长度,默认4位
* @param {Number} len 显示星号的长度,默认10位
* @returns {String} 返回转化后字符串
*/
function formatStartOfBankCard(value, start = 4, len = 11) {
return _formatStartOf(value, start, len);
}
/**
* 字符串固定位数转为星号
* @param {String|Number} value 参数
* @param {Number} start 前缀长度
* @param {Number} len 显示星号的长度
* @returns {String} 返回转化后字符串
*/
function _formatStartOf(value, start, len) {
value = String(value);
if (start > value.length) return value;
// len小于0和len大于剩余长度
let startStr = "";
if (len < 0) len = 0;
if (len > value.length - start) {
len = value.length - start;
}
startStr = String().padEnd(len, "*");
return value.substring(0, start) + startStr + value.substring(start + len);
}
exports.decode = decode;
exports.encode = encode;
exports.formatRmbChinese = formatRmbChinese;
exports.formatStartOfBankCard = formatStartOfBankCard;
exports.formatStartOfIdCard = formatStartOfIdCard;
exports.formatStartOfMobile = formatStartOfMobile;
exports.formatStartOfName = formatStartOfName;
exports.formatThousand = formatThousand;
exports.inString = inString;
exports.replaceAll = replaceAll;
exports.toCamelCase = toCamelCase;
exports.toKebabCase = toKebabCase;
exports.toLower = toLower;
exports.toPascalCase = toPascalCase;
exports.toSnakeCase = toSnakeCase;
exports.toUpper = toUpper;
exports.trim = trim;
exports.trimAll = trimAll;
exports.trimEnd = trimEnd;
exports.trimStart = trimStart;
exports.zeroEnd = zeroEnd;
exports.zeroStart = zeroStart;