yao-stringutils
Version:
字符串处理工具集,诸如'contains', 'toLength', 'getLeft', 'getLeftOuter', 'getRight', 'getRightOuter', 'getSection', 'getSectionOuter'……函数
224 lines (199 loc) • 8.4 kB
JavaScript
class StringUtils {
/**
* 将对象转换成字符串,undefined、null、NaN 将被转成 _undefined_、_null_、_NaN_
* @param {Object} obj 对象
* @param {Object} [options = { _NaN_ : '', _null_ : '', _undefined_ : '' }] - 配置。
* @param {string} [options._NaN_ = ''] NaN的替身,如果 obj == NaN 则返回''
* @param {string} [options._null_ = ''] null的替身,如果 obj == _null_ 则返回''
* @param {string} [options._undefined_= ''] undefined的替身,如果 obj == _undefined_ 则返回''
* @returns {string} 返回字符串
*/
static toString(obj, options = {}) {
let { _NaN_ = '', _null_ = '', _undefined_ = '' } = options;
if (obj === undefined) {
return _undefined_;
} else if (obj === null) {
return _null_;
} else if (Number.isNaN(obj)) {
return _NaN_;
}
return obj.toString();
}
/**
* 判断源字符串中是否包含子字符串
* @param {string} str 源字符串
* @param {string} substr 子字符串
* @returns {boolean} true if src contains str; false else; false if str === undefined or str === null.
*/
static contains(str, substr) {
if (str === undefined || str === null) return false;
return -1 !== str.toString().indexOf(substr);
}
/**
* 判断对象转成字符串后是否为:undefined、null、NaN、""
* @param {string|object} obj 字符串 将调用 obj.toString() 转成字符串
* @returns {boolean} true 为空 | false 非空
*/
static isEmpty(obj) {
return obj === undefined || obj === null || Number.isNaN(obj) || '' === obj.toString();
}
/**
* 判断对象转成字符串后是否为:undefined、null、NaN、"" 或者 字符串经过.trim()后是否为:""
* @param {string|object} obj 对象 将调用 obj.toString() 转成字符串
* @returns {boolean} true 为空 | false 非空
*/
static isTrimEmpty(obj) {
return obj === undefined || obj === null || Number.isNaN(obj) || '' === obj.toString().trim();
}
/**
* 判断列表中的对象全都不命中isEmpty(),包括list本身
* @param {Array|Set} list 列表(需要能被for...of遍历)
* @returns {boolean} false list或其中的元素isEmpty() | false 全都!isEmpty()
*/
static allNotEmpty(list) {
if (StringUtils.isEmpty(list)) return false;
for (let item of list) {
if (StringUtils.isEmpty(item)) {
return false;
}
}
return true;
}
/**
* 判断列表中的对象全都不命中isTrimEmpty(),包括list本身
* @param {Array|Set} list 列表(需要能被for...of遍历)
* @returns {boolean} false list或其中的元素isTrimEmpty() | false 全都!isTrimEmpty()
*/
static allNotTrimEmpty(list) {
if (StringUtils.isTrimEmpty(list)) return false;
for (let item of list) {
if (StringUtils.isTrimEmpty(item)) {
return false;
}
}
return true;
}
/**
* 将字符串填充或截断成指定宽度
* @param {string} str 源字符串
* @param {number} len 指定长度
* @param {Object} [options] 配置对象
* @param {string} [options.filler = " "] 用于作填充的字符(默认' ')
* @param {number} [options.align = -1] 对方方式(-1居左,0居中,1居右,默认-1)
* @param {string} [options.ellipsis = '...'] 省略字符(默认'...')
* @returns {string} 处理后的字符串
*/
static toLength(str, len, options = {}) {
if ('string' !== typeof str) str = StringUtils.toString(str);
let { filler = ' ', align = -1, ellipsis = '...' } = options;
if (filler.length > 1) {
filler = filler.substring(0, 1);
}
if (str.length <= len) {
let t = true;
while (str.length < len) {
if (0 === align) {
str = (t = !t) ? filler + str : str + filler;
} else if (align > 0) {
str = filler + str;
} else {
str = str + filler;
}
}
return str;
}
if (len <= ellipsis.length) { return str.substring(0, len); }
return str.substring(0, len - ellipsis.length) + ellipsis;
}
/**
* 得到指定位置左侧的字符串: getLeft('aaa|bbb|ccc|ddd|eee', '|') > 'aaa'
* @param {string} str 源字符串
* @param {string} pos 位置字符串
* @returns {string} undefined if src === undefined; null if src === null; null if pos not in src.
*/
static getLeft(str, pos) {
if (undefined === str) return undefined;
if (null === str) return null;
if (pos === '') return str;
let p = str.indexOf(pos);
if (-1 === p) { return null; }
return str.substring(0, p);
}
/**
* 得到指定位置左侧的字符串(最最大匹配): getLeftOuter('aaa|bbb|ccc|ddd|eee', '|') > 'aaa|bbb|ccc|ddd'
* @param {string} str 源字符串
* @param {string} pos 位置字符串
* @returns {string} undefined if src === undefined; null if src === null; null if pos not in src.
*/
static getLeftOuter(str, pos) {
if (undefined === str) return undefined;
if (null === str) return null;
if (pos === '') return str;
let p = str.lastIndexOf(pos);
if (p == -1) { return null; }
return str.substring(0, p);
}
/**
* 得到指定位置右侧的字符串: getRight('aaa|bbb|ccc|ddd|eee', '|') > 'eee'
* @param {string} str 源字符串
* @param {string} pos 位置字符串
* @returns {string} undefined if src === undefined; null if src === null; null if pos not in src.
*/
static getRight(str, pos) {
if (undefined === str) return undefined;
if (null === str) return null;
if (pos === '') return str;
let p = str.lastIndexOf(pos);
if (p == -1) { return null; }
return str.substring(p + pos.length);
}
/**
* 得到指定位置右侧的字符串(最最大匹配):getRightOuter('aaa|bbb|ccc|ddd|eee', '|') > 'bbb|ccc|ddd|eee'
* @param {string} str 源字符串
* @param {string} pos 位置字符串
* @returns {string} undefined if src === undefined; null if src === null; null if pos not in src.
*/
static getRightOuter(str, pos) {
if (undefined === str) return undefined;
if (null === str) return null;
if (pos === '') return str;
let p = str.indexOf(pos);
if (p == -1) { return null; }
return str.substring(p + pos.length);
}
/**
* 得到指定边界字符串中间的字符串: getSection('aaa|bbb|ccc|ddd|eee', '|', '|') > 'bbb'
* @param {string} str 源字符串
* @param {string} left 左边界
* @param {string} right 右边界
* @returns {string} undefined if src === undefined; null if src === null; null if left not in src or right not in src.
*/
static getSection(str, left, right) {
if (undefined === str) return undefined;
if (null === str) return null;
let l = str.indexOf(left);
let r = str.indexOf(right, l + 1);
if (l == -1 || r == -1) { return null; }
if (left === '') l = 0; else l++;
if (right === '') r = str.length;
return str.substring(l, r);
}
/**
* 得到指定边界字符串中间的字符串(最最大匹配): getSectionOuter('aaa|bbb|ccc|ddd|eee', '|', '|') > 'bbb|ccc|ddd'
* @param {string} str 源字符串
* @param {string} left 左边界
* @param {string} right 右边界
* @returns {string} undefined if src === undefined; null if src === null; null if left not in src or right not in src.
*/
static getSectionOuter(str, left, right) {
if (undefined === str) return undefined;
if (null === str) return null;
let l = str.indexOf(left);
let r = str.lastIndexOf(right);
if (l == -1 || r == -1) { return null; }
if (left === '') l = 0; else l++;
if (right === '') r = str.length;
return str.substring(l, r);
}
}
module.exports = StringUtils;