UNPKG

@siakhooi/number-to-chinese-words

Version:
94 lines 4.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Convertor = void 0; const Constants_1 = require("./Constants"); const FloatingNumberConvertor_1 = require("./FloatingNumberConvertor"); const ConversionContext_1 = require("./ConversionContext"); const BasicNumberConvertor_1 = require("./BasicNumberConvertor"); class Convertor { context; basicNumber; constructor(options) { this.context = new ConversionContext_1.ConversionContext(options); this.basicNumber = new BasicNumberConvertor_1.BasicNumberConvertor(this.context); } getZeroOrEmptyIf(expression) { return expression ? this.context.characterSet.ZERO : ''; } convert_w(segment1, number, removeLeadingOne) { if (segment1 === 0) return this.getZeroOrEmptyIf(number === 0); const c = this.basicNumber.convert_0_to_9999(segment1, number < 1_0000 && removeLeadingOne, // NOSONAR ''); const prefix = this.getZeroOrEmptyIf(segment1 < 1_000 && number >= 1_0000); // NOSONAR return prefix + c; } convert_ww_and_www(segment, number, removeLeadingOne, smallerSegment, threshold, suffix) { if (segment === 0) return this.getZeroOrEmptyIf(number >= threshold && smallerSegment >= 1000); const c = this.basicNumber.convert_0_to_9999(segment, number < threshold && removeLeadingOne, suffix); const prefix = this.getZeroOrEmptyIf(segment < 1000 && number >= threshold); return prefix + c; } convert_wwww(segment4, removeLeadingOne) { if (segment4 === 0) return ''; return this.basicNumber.convert_0_to_9999(segment4, segment4 > 0 && removeLeadingOne, this.context.characterSet.TRILLION); } convert_0_to_wwww(number) { const removeLeadingOne = !!this.context.options.removeLeadingOne; const segment1 = number % 1_0000; // NOSONAR const segment2 = Math.floor(number / 1_0000) % 1_0000; // NOSONAR const segment3 = Math.floor(number / 1_0000_0000) % 1_0000; // NOSONAR const segment4 = Math.floor(number / 1_0000_0000_0000); // NOSONAR const char1 = this.convert_w(segment1, number, removeLeadingOne); const char2 = this.convert_ww_and_www(segment2, number, removeLeadingOne, segment1, 1_0000_0000, // NOSONAR this.context.characterSet.TENTHOUSAND); const char3 = this.convert_ww_and_www(segment3, number, removeLeadingOne, segment2, 1_0000_0000_0000, // NOSONAR this.context.characterSet.HUNDREDMILLION); const char4 = this.convert_wwww(segment4, removeLeadingOne); return char4 + char3 + char2 + char1; } checkNotSupportedCases(number) { if (number < -Number.MAX_SAFE_INTEGER || number > Number.MAX_SAFE_INTEGER) throw Constants_1.ERR_NOT_SUPPORTED; if (number !== Math.floor(number)) { if (number.toString().length > Constants_1.MAX_DECIMAL_POINTS + 1 + Math.floor(number).toString().length) throw Constants_1.ERR_NOT_SUPPORTED; } } getSign(number) { if (number < 0) return this.context.characterSet.NEGATIVE; if (number > 0 && this.context.options.displayPositive) return this.context.characterSet.POSITIVE; return ''; } combine(sign, convertedInteger, convertedFloat, integerNumber) { if (convertedFloat.length === 0) { return sign + convertedInteger; } else { const dot = this.context.getDot(); if (!!this.context.options.useTraditionalFloatingUnit && integerNumber === 0) { return sign + convertedFloat; } else return sign + convertedInteger + dot + convertedFloat; } } convertNumber(number) { this.checkNotSupportedCases(number); const sign = this.getSign(number); const f = new FloatingNumberConvertor_1.FloatingNumberConvertor(this.context); number = Math.abs(number); const integerNumber = Math.floor(number); const convertedFloat = f.convertFloat(number); const convertedInteger = this.convert_0_to_wwww(integerNumber); return this.combine(sign, convertedInteger, convertedFloat, integerNumber); } } exports.Convertor = Convertor; //# sourceMappingURL=Convertor.js.map