@gitsunmin/k-number
Version:
숫자를 입력하면 한글 수사를 반환하는 기능을 제공하는 라이브러리입니다. (ex. 1234 -> 천이백삼십
81 lines (80 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.kNumber = void 0;
const constants_1 = require("@/constants");
const errors_1 = require("@/errors");
const utils_1 = require("@/utils");
const LooseBigUnits = ['', ...constants_1.BIG_UNITS];
const LooseSmallUnits = ['', ...constants_1.SMALL_UNITS];
const getUnit = (index, array) => {
const unit = (0, utils_1.isInteger)(index / 4) ? LooseBigUnits[index / 4] : '';
const isNotZero = array.slice(index, index + 4).join('') !== '0000';
return unit && isNotZero ? unit : '';
};
const formatKorean = (input, index, array) => {
const unit = getUnit(index, array);
if (input === '-')
return input;
return input !== '0'
? constants_1.NUMBER_AND_KOREAN_RECORD[input] + LooseSmallUnits[index % 4] + unit
: unit;
};
const formatUnitOnly = (input, index, array) => {
const unit = getUnit(index, array);
if (input === '-')
return input;
return input !== '0' ? input + LooseSmallUnits[index % 4] + unit : unit;
};
const functionByFormat = (format) => {
if (format === 'korean-only')
return formatKorean;
if (format === 'unit-only')
return formatUnitOnly;
};
const safe = (input, config) => {
const invalid = (input, config) => {
if (typeof input !== 'number')
return errors_1.ErrorCollection.NOT_NUMBER;
if (!(0, utils_1.isInteger)(input))
return errors_1.ErrorCollection.NOT_INTEGER;
if (input > constants_1.MAX_NUMBER)
return errors_1.ErrorCollection.OVER_MAX_NUMBER;
if (input < constants_1.MIN_NUMBER)
return errors_1.ErrorCollection.UNDER_MIN_NUMBER;
if (config !== undefined && config.format !== undefined && config.format !== 'korean-only' && config.format !== 'unit-only')
return errors_1.ErrorCollection.INVALID_FORMAT;
return null;
};
const error = invalid(input, config);
if (error === null) {
return {
_tag: 'Valid',
value: input,
};
}
else {
return {
_tag: 'Invalid',
value: error,
};
}
};
const kNumber = (input, config = { format: 'korean-only', onError: (error) => error }) => {
const { format = 'korean-only', onError = (error) => error } = config;
try {
const safedInput = safe(input, config);
if (safedInput._tag === 'Invalid')
return onError(safedInput.value);
const formatFunction = functionByFormat(format) || ((value) => value);
const numberArray = safedInput.value.toString().split('').reverse();
return numberArray
.map(formatFunction)
.reverse()
.join('');
}
catch (error) {
console.error(`${constants_1.LOG_PREFIX} ${errors_1.ErrorCollection.UNKNOWN_ERROR} ${error}`);
return onError(errors_1.ErrorCollection.UNKNOWN_ERROR);
}
};
exports.kNumber = kNumber;