ze-react-component-library
Version:
ZeroETP React Component Library
213 lines (179 loc) • 5.12 kB
JavaScript
import numeral from "numeral";
import _ from "underscore"; // a for english, A for chinese
var autoFormatterForValue = function autoFormatterForValue(value, formatter) {
var abs = Math.abs(value);
if (formatter === "a") {
// k, m, b
if (abs < 1000) {
return "";
}
if (abs < 1000000) {
return "k";
}
if (abs < 1000000000) {
return "m";
}
return "b";
}
if (formatter === "A") {
// w, m, y
if (abs < 10000) {
return "";
}
if (abs < 100000000) {
return "w";
} // if (abs < 100000000) {
// return "m";
// }
return "y";
}
};
export var leastCommonFormatterAndUnit = function leastCommonFormatterAndUnit(values, formatter, t) {
if (t === void 0) {
t = function t(s) {
return s;
};
}
var formatterMap = {
a: ["", "k", "m", "b"],
A: ["", "w", "y"]
};
var formatterIndex = values.filter(function (v) {
return v !== 0 && v !== null && v !== undefined;
}) // 0的数据不作为自动判别的依据
.map(function (v) {
var f = autoFormatterForValue(v, formatter);
var index = formatterMap[formatter].findIndex(function (item) {
return item === f;
});
return index;
}); // 所有数据都是0
if (formatterIndex.length === 0) {
return {
formatter: formatter,
unit: ''
};
}
var finalFormatter = formatterMap[formatter][_.min(formatterIndex)];
var unit = "";
switch (finalFormatter) {
case "k":
unit = "千";
break;
case "m":
unit = "百万";
break;
case "b":
unit = "十亿";
break;
case "w":
unit = "万";
break;
case "y":
unit = "亿";
break;
default:
break;
}
return {
formatter: finalFormatter,
unit: t(unit)
};
}; // 这里覆盖mk主要是为了去掉单位。单位由另外的地方提供,这样可以灵活一点
numeral.register("format", "million", {
regexps: {
format: /(m)/,
unformat: /(m)/
},
format: function format(value, _format, roundingFunction) {
return numeral._.numberToFormat(value / 1000000, _format.substring(0, _format.length - 1), roundingFunction);
},
unformat: function unformat(string) {
return numeral._.stringToNumber(string) * 1000000;
}
});
numeral.register("format", "thousand", {
regexps: {
format: /(k)/,
unformat: /(k)/
},
format: function format(value, _format2, roundingFunction) {
return numeral._.numberToFormat(value / 1000, _format2.substring(0, _format2.length - 1), roundingFunction);
},
unformat: function unformat(string) {
return numeral._.stringToNumber(string) * 1000;
}
});
numeral.register("format", "tenthousand", {
regexps: {
format: /(w)/,
unformat: /(w)/
},
format: function format(value, _format3, roundingFunction) {
return numeral._.numberToFormat(value / 10000, _format3.substring(0, _format3.length - 1), roundingFunction);
},
unformat: function unformat(string) {
return numeral._.stringToNumber(string) * 10000;
}
});
numeral.register("format", "yi", {
regexps: {
format: /(y)/,
unformat: /(y)/
},
format: function format(value, _format4, roundingFunction) {
return numeral._.numberToFormat(value / 100000000, _format4.substring(0, _format4.length - 1), roundingFunction);
},
unformat: function unformat(string) {
return numeral._.stringToNumber(string) * 100000000;
}
}); // 中国的缩略,目前分为:元、万、亿,三个等级
numeral.register("format", "chineseabbreviation", {
regexps: {
format: /(A)/,
unformat: /(A)/
},
format: function format(value, _format5, roundingFunction) {
var wan = 10000.0; // 万
var yi = 100000000.0; // 亿
var abs = Math.abs(value);
var adjValue;
var unit = "";
if (abs < wan) {
adjValue = value;
} else if (abs < yi) {
adjValue = value / wan;
unit = "万";
} else {
adjValue = value / yi;
unit = "亿";
}
return numeral._.numberToFormat(adjValue, _format5.substring(0, _format5.length - 1), roundingFunction) + unit;
},
unformat: function unformat(string) {
var thousand = 1000.0; // 千
var wan = 10000.0; // 万
var million = 1000000.0; // 百万
var yi = 100000000.0; // 亿
var billion = 1000000000.0; // 十亿
var scale = 1.0;
var numberString = string;
if (string.endsWith("千")) {
scale = thousand;
numberString = string.substring(0, string.length - 1);
} else if (string.endsWith("百万")) {
scale = million;
numberString = string.substring(0, string.length - 2);
} else if (string.endsWith("十亿")) {
scale = billion;
numberString = string.substring(0, string.length - 2);
} else if (string.endsWith("万")) {
scale = wan;
numberString = string.substring(0, string.length - 1);
} else if (string.endsWith("亿")) {
scale = yi;
numberString = string.substring(0, string.length - 1);
}
return numeral._.stringToNumber(numberString) * scale;
}
});