@siakhooi/number-to-chinese-words
Version:
Library to translate number into chinese words
89 lines (88 loc) • 4.22 kB
JavaScript
"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 {
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 < 10000 && removeLeadingOne, '');
const prefix = this.getZeroOrEmptyIf(segment1 < 1000 && number >= 10000);
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 % 10000;
const segment2 = Math.floor(number / 10000) % 10000;
const segment3 = Math.floor(number / 100000000) % 10000;
const segment4 = Math.floor(number / 1000000000000);
const char1 = this.convert_w(segment1, number, removeLeadingOne);
const char2 = this.convert_ww_and_www(segment2, number, removeLeadingOne, segment1, 100000000, this.context.characterSet.TENTHOUSAND);
const char3 = this.convert_ww_and_www(segment3, number, removeLeadingOne, segment2, 1000000000000, 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;