/**
-
阿拉伯数字转中文数字
-
@param {int || string} str 待转换的阿拉伯数字
-
@param {string} letterCase 大写'upper'或小写'lower',默认是'lower'
-
@return {string} 返回排列后的字符串
*/
function toCn() {
var str = arguments[0] || '';
if (str == '') return '';
str += '';
if (arguments[1] && arguments[1] === 'upper') {
numStrs = ['壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
units = ['', '拾', '佰', '仟', '万', '拾万', '佰万', '仟万', '亿'];
} else {
numStrs = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
units = ['', '十', '百', '千', '万', '十万', '百万', '千万', '亿'];
}
var ret = ''
if (str.charAt(0) === '-') {
ret = '负';
str = str.substr(1);
}
var bigger = Math.floor(parseInt(str) / 10000).toString();
var st = (str.length - 4 < 0) ? 0 : (str.length - 4);
var smaller = str.substr(st);
var arr = [[bigger, '万'], [smaller, '']];
var unit;
for (var j = 0; j < arr.length; j++) {
str = arr[j][0];
unit = arr[j][1];
if (str === '0') continue;
for (var i = 0; i < str.length; i++) {
var num = parseInt(str.charAt(i));
if (num === 0) {
if (ret.substr(ret.length - 1) !== '零') {
ret += '零';
}
} else {
ret += numStrs[num - 1] + units[str.length - i - 1];
}
}
if (ret.charAt(ret.length - 1) === '零') {
ret = ret.substr(0, ret.length - 1);
}
ret += unit;
}
var prefix = ret.substr(0, 2);
if (prefix === '一十' || prefix === '壹拾') {
ret = ret.substr(1);
}
return ret;
}
//--------------String.prototype--------------
var sp = String.prototype;
/**
-
递增重复模板字符串
-
如: "hello_{12-2:3}.multi(3)"表示重复3次并递增替换模板中{}中间的数字
-
12表示起始数字,-2表示步长(默认为1,可省略),:3表示最小宽度为3(默认不改变宽度,可省略)
-
结果为: "hello_12\nhello_10\nhello_8"
-
如:"hello_{}.multi(['gnu', 'linux', 'free', 'open'])表示用数组中的值替换{}中间的内容
-
结果为:"hello_gnu\nhello_linux\nhello_free\nhello_open
-
@param {int} count 输出个数,如果是数组,则遍历数组替换{}中的值
-
@param {string} letterCase 大写'upper'或小写'lower'或数字'number',默认是'number'
-
@return {Array} 返回递增重复模板后的字符串数组
/
function _multi(str, count, letterCase) {
str = str.replace(/\n$/, '');
count = count || 5;
letterCase = letterCase || 'number';
var arr = [], reg, groups;
if (count instanceof Array) {
reg = new RegExp(/(.?){}(.*)/);
groups = str.match(reg);
var prefix = groups[1], suffix = groups[2];
for (var i = 0; i < count.length; i++) {
arr.push(prefix + count[i] + suffix);
}
return arr;
}
reg = new RegExp(/{(\d+)(.\d+)?(.\d+)?}/);
var init,
initStr,
width,
step = 1,
width = 0,
symbol = '',
prefixStr = '0';
groups = str.match(reg);
init = parseInt(groups[1]);
for (var gi = 2; gi <= 3; gi++) {
symbol = groups[gi]
if (symbol) {
if (symbol.charAt(0) === ':') {
width = parseInt(symbol.substr(1))
} else {
step = parseInt(symbol)
}
}
}
while (count--) {
initStr = init.toString();
if (letterCase === 'upper' || letterCase === 'lower') {
initStr = toCn(initStr, letterCase);
prefixStr = ' ';
}
for (var i = initStr.length; i < width; i++) {
if (initStr.charAt(0) == '-') {
initStr = '-' + prefixStr + initStr.substr(1)
} else {
initStr = prefixStr + initStr;
}
}
arr.push(str.replace(reg, initStr));
init += step;
}
return arr;
};
// 垂直方向递增重复
sp.multi = sp.vMulti = function () {
return _multi(this, arguments[0], arguments[1]).join('\n');
}
// 水平方向递增重复
sp.hMulti = function () {
return _multi(this, arguments[0], arguments[1]).join('');
}
/**
- 对字符串进行去重,先分隔,最后组合
- @param {string} sep 分隔符,默认以英文逗号,分隔
- @return {string} 去重后的字符串
/
sp.unique = function() {
var str = this.replace(/\n$/, '');
var sep = arguments[0] || ',';
var arr = str.split(sep);
var i, j;
for (i =0; i < arr.length; i++) {
arr[i] = arr[i].replace(/(^\s)|(\s*$)/g, '');
}
var ret = [], hasEl;
for (i = 0; i < arr.length; i++) {
hasEl = false;
for (j = 0; j < ret.length; j++) {
if (arr[i] === ret[j]) {
hasEl = true;
break;
}
}
if (!hasEl) {
ret.push(arr[i]);
}
}
return ret.join(sep);
}
/**
-
对字符串进行排序,先分隔,最后组合
-
@param {string} sep 分隔符,默认以英文逗号,分隔
-
@param {string} order 升序asc或降序desc,默认asc
-
@param {bool} isNumber 是否解析为数字
-
@return {string} 排序后的字符串
/
function _sort(str, sep, order, isNumber) {
str = str.replace(/\n$/, '');
sep = sep || ',';
order = order === 'desc' ? 'desc' : 'asc';
var arr = str.split(sep);
var ret = [], trims = [], i, j, tmp, trim;
for (i = 0; i < arr.length; i++) {
trim = arr[i].replace(/(^\s)|(\s*$)/g, '');
ret.push(trim);
if (isNumber) {
trim = parseFloat(trim)
}
trims.push(trim);
}
for (i = 0; i < trims.length - 1; i++) {
for (j = i + 1; j < trims.length; j++) {
if (trims[i] > trims[j]) {
tmp = trims[i];
trims[i] = trims[j];
trims[j] = tmp;
tmp = ret[i];
ret[i] = ret[j];
ret[j] = tmp;
}
}
}
if (order === 'desc') {
return ret.reverse().join(sep);
}
return ret.join(sep);
}
// 排序;如"a, c, d, b, e" 变为 "a, b, c, d, e"
sp.sort = function() {
return _sort(this, arguments[0], arguments[1], false);
}
// 数字型排序;如"12a, 23, 2a, 1, 34" 变为 "1, 2a, 12a, 23, 34"
sp.numberSort = function () {
return _sort(this, arguments[0], arguments[1], true);
}
/**
- 对字符串进行分隔,统计
- @param {string} sep 分隔符,默认以空白符分隔
- @param {string} order 次数升序asc或降序desc,默认desc
- @return {string} 排序后的字符串
/
sp.count = function() {
var str = this.replace(/(^\s)|(\s*$)/g, '');
var sep = arguments[0] || /\s+/;
var order = arguments[1] === 'asc' ? 'asc' : 'desc';
var arr = str.split(sep);
var obj = {}, i, j, key, idx;
for (i = 0; i < arr.length; i++) {
if (obj[arr[i]]) {
obj[arr[i]] += 1;
} else {
obj[arr[i]] = 1;
}
}
var ret = [];
for (key in obj) {
idx = -1;
for (j = 0; j < ret.length; j++) {
if (obj[key] > ret[j][1]) {
idx = j;
break;
}
}
if (idx === -1) {
ret.push([key, obj[key]])
} else {
ret.splice(idx, 0, [key, obj[key]])
}
}
if (order === 'asc') {
ret = ret.reverse();
}
for (i = 0; i < ret.length; i++) {
ret[i] = ret[i][0] + '=>' + ret[i][1];
}
return ret.join(', ');
}