util-helpers
Version:
119 lines (115 loc) • 3.74 kB
JavaScript
'use strict';
var ut2 = require('ut2');
var math_util = require('./utils/math.util.js');
var devWarn = require('./utils/devWarn.js');
var chnNumberChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
var chnUnitChar = ['', '十', '百', '千'];
var big5NumberChar = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
var big5UnitChar = ['', '拾', '佰', '仟'];
var numberChar;
var unitChar;
var unitSection;
function sectionToChinese(section) {
var str = '';
var chnstr = '';
var zero = false;
var unitPos = 0;
while (section > 0) {
var v = section % 10;
if (v == 0) {
if (zero) {
zero = false;
chnstr = numberChar[v] + chnstr;
}
}
else {
zero = true;
str = numberChar[v];
str += unitChar[unitPos];
chnstr = str + chnstr;
}
unitPos++;
section = Math.floor(section / 10);
}
return chnstr;
}
function convertInteger(num) {
var numInt = Math.floor(num);
var unitPos = 0;
var strIns = '';
var chnStr = '';
var needZero = false;
if (numInt === 0) {
return numberChar[0];
}
while (numInt > 0) {
var section = numInt % 10000;
if (needZero) {
chnStr = numberChar[0] + chnStr;
}
strIns = sectionToChinese(section);
strIns += section !== 0 ? unitSection[unitPos] : unitSection[0];
chnStr = strIns + chnStr;
needZero = section < 1000 && section > 0;
numInt = Math.floor(numInt / 10000);
unitPos++;
}
return chnStr;
}
function convertDecimal(num) {
var strNum = num + '';
var index = strNum.indexOf('.');
var ret = '';
if (index > -1) {
var decimalStr = strNum.slice(index + 1);
ret = mapNumberChar(decimalStr);
}
return ret;
}
function mapNumberChar(num) {
var strNum = num + '';
var ret = '';
for (var i = 0, len = strNum.length; i < len; i++) {
ret += numberChar[parseInt(strNum[i])];
}
return ret;
}
function numberToChinese(num, options) {
if (options === void 0) { options = {}; }
var _a = options.big5, big5 = _a === void 0 ? false : _a, _b = options.unit, unit = _b === void 0 ? true : _b, _c = options.zero, zero = _c === void 0 ? '' : _c, _d = options.negative, negative = _d === void 0 ? '负' : _d, _e = options.unitConfig, unitConfig = _e === void 0 ? {} : _e;
var _f = options.decimal, decimal = _f === void 0 ? '' : _f;
if (typeof num !== 'number' || ut2.isNaN(num)) {
devWarn("\u53C2\u6570\u9519\u8BEF ".concat(num, "\uFF0C\u8BF7\u4F20\u5165\u6570\u5B57"));
return '';
}
math_util.checkBoundary(num);
if (big5) {
numberChar = big5NumberChar.slice();
unitChar = big5UnitChar.slice();
decimal = decimal || '點';
}
else {
numberChar = chnNumberChar.slice();
unitChar = chnUnitChar.slice();
decimal = decimal || '点';
}
var unitWan = unitConfig.w || '万';
var unitYi = unitConfig.y || '亿';
var unitWanYi = unitWan + unitYi;
unitSection = ['', unitWan, unitYi, unitWanYi];
if (zero) {
numberChar[0] = zero;
}
var preStr = num < 0 ? negative : '';
var chnInteger;
var numAbs = Math.abs(num);
if (unit) {
chnInteger = convertInteger(numAbs);
}
else {
chnInteger = mapNumberChar(Math.floor(numAbs));
}
var chnDecimal = convertDecimal(numAbs);
return chnDecimal ? "".concat(preStr).concat(chnInteger).concat(decimal).concat(chnDecimal) : "".concat(preStr).concat(chnInteger);
}
module.exports = numberToChinese;