dxrmb
Version:
[](https://www.npmjs.com/package/dxrmb)
226 lines (220 loc) • 6.43 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var Decimal = _interopDefault(require('decimal.js'));
var zhFractions = ['角', '分'];
var zhDigits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
// 大单位
var zhUnits = ['', '万', '亿', '兆', '京', '垓', '秭', '穰', '沟', '涧', '正', '载', '极', '恒河沙', '阿僧祗', '那由他', '不可思议', '无量', '大数'];
// 最大到那由他
var limitNum = /*#__PURE__*/new Decimal(10).toPower(64);
// 局部单位
var unitl = ['', '拾', '佰', '仟'];
function extractDigits(_int) {
var digits = [];
var base = 10;
var number = _int;
while (true) {
// 余数
var remainder = number.mod(base);
digits.push(remainder.toNumber());
// 商
var quotient = number.divToInt(base);
if (quotient.isZero()) break;
number = quotient;
}
return digits;
}
// 数组分块
function splitArray(array, chunkSize) {
var result = [];
for (var i = 0; i < array.length; i += chunkSize) {
result.push(array.slice(i, i + chunkSize));
}
return result;
}
function first(arr) {
return arr[0];
}
function last(arr) {
return arr[arr.length - 1];
}
function trimZeroLocal(locals) {
var localStack = [];
for (var i = 0; i < locals.length; i++) {
var local = locals[i];
var top = last(localStack);
if ((top == null ? void 0 : top.num) === 0 && local.num === 0) continue;
localStack.push(local);
}
while (localStack.length > 0) {
if (first(localStack).num !== 0) break;
// if (localStack.length <= 1) break;
localStack.shift();
}
while (localStack.length > 0) {
if (last(localStack).num !== 0) break;
// if (localStack.length <= 1) break;
localStack.pop();
}
// console.log(thunk);
// console.log("localstack:", localStack);
return localStack;
}
function spell(localStack) {
var words;
if (localStack.length === 0) {
words = zhDigits[0];
} else {
words = localStack.map(function (e) {
return e.num !== 0 ? "" + e.numHan + e.unit : "" + e.numHan;
}).reverse().join('');
}
return words;
}
function parseIntegerPart(integerPart) {
// 整数部分各个单位的值
// 1008610086
// [ 1,0,0,8,6,0,0,8,6 ]
var digits = extractDigits(integerPart);
// 将整个数字拆分到对应的大单位上
// [ [1], [0,0,8,6], [0,0,8,6] ]
// 亿 千百十万 千百十个
var digitsThunks = splitArray(digits, 4);
var thunkStack = [];
// 针对每个trunk进行处理
for (var thunkIdx = 0; thunkIdx < digitsThunks.length; thunkIdx++) {
var _digits = digitsThunks[thunkIdx];
// 单位
var thunkUnit = zhUnits[thunkIdx];
var unitId = thunkIdx;
// 局部处理
var localResult = [];
for (var digitIdx = 0; digitIdx < _digits.length; digitIdx++) {
var num = _digits[digitIdx];
var numHan = zhDigits[num];
var localUnit = unitl[digitIdx];
localResult.push({
num: num,
numHan: numHan,
unit: localUnit
});
}
// 局部移除不必要0
var localStack = trimZeroLocal(localResult);
// 局部的值
var thunkValue = 0;
for (var q = 0; q < localResult.length; q++) {
thunkValue += localResult[q].num * Math.pow(10, q);
}
thunkStack.push({
localResult: localResult,
unit: thunkUnit,
unitId: unitId,
localStack: localStack,
value: thunkValue
});
}
// 读数
var spelledThunk = [];
var allWords = [];
for (var i = thunkStack.length - 1; i >= 0; i--) {
var aThunk = thunkStack[i];
if (aThunk.value === 0) continue;
var words = spell(aThunk.localStack);
var lastThunk = last(spelledThunk);
if (lastThunk) {
if (lastThunk.unitId - aThunk.unitId > 1) {
// 要加0,因为上一个空的被跳过了
allWords.push('零');
} else {
// 如果是相邻的,则要判断当前的最高位是否为空
// 能到达这里说明当前的最高位应该是千位,
// 因为能到这里说明肯定在更高的位置上有更大的单位阿斯顿发山东发生的
if (last(aThunk.localResult).num === 0) {
allWords.push('零');
}
}
}
allWords.push("" + words + aThunk.unit);
spelledThunk.push(aThunk);
}
return {
allWords: allWords,
thunkStack: thunkStack,
isZero: integerPart.isZero()
};
}
function spellFraction(result) {
var words = result.map(function (e) {
if (e.num === 0) return '';
return "" + e.numHan + e.unit;
});
return words;
}
function parseDecimalPart(decimalPart) {
var thunks = [];
var isZero = true;
var number = decimalPart;
for (var i = 0; i < zhFractions.length; i++) {
number = number.mul(10);
var remainder = number.mod(10).floor();
var num = remainder.toNumber();
thunks.push({
num: num,
numHan: zhDigits[num],
unit: zhFractions[i],
unitId: i
});
if (num != 0) {
isZero = false;
}
}
var allWords = spellFraction(thunks);
return {
allWords: allWords,
thunks: thunks,
isZero: isZero
};
}
function dxrmb(value) {
var sign = Decimal.sign(value);
// 负数后面在考虑
var number = Decimal.abs(value);
if (number.cmp(limitNum) >= 0) {
throw new Error('超过最大支持10的64次方');
}
// 获取整数部分
var integerPart = Decimal.floor(number);
var decimalPart = Decimal.sub(number, integerPart);
// 解析
var integer = parseIntegerPart(integerPart);
var decimal = parseDecimalPart(decimalPart);
var words = [];
// 读元
if (!integerPart.isZero()) {
words.push(integer.allWords.join(''), '元');
}
if (decimal.thunks[0].num !== 0) {
words.push(decimal.thunks[0].numHan, '角');
}
if (decimal.thunks[1].num !== 0) {
// if (integerPart !== 0 && decimal.thunks[0].num === 0) {
// words.push("零");
// }
words.push(decimal.thunks[1].numHan, '分');
}
if (words.length === 0) {
return '零元整';
}
// 如果有元而且没分就以整结尾
if (!integerPart.isZero() && decimal.thunks[1].num === 0) {
words.push('整');
}
if (sign < 0) {
words.unshift('负');
}
return words.join('');
}
exports.default = dxrmb;
//# sourceMappingURL=dxrmb.cjs.development.js.map