nnk-js
Version:
Converts written numbers into their numerical values.
96 lines (86 loc) • 2.6 kB
JavaScript
class NoNumbersKeyboard {
constructor() {
return new Proxy(this, {
get: (target, prop) => {
if (typeof prop === 'string') {
return () => this.#parseMethodName(prop);
}
return target[prop];
}
});
}
#parseMethodName(methodName) {
const wordsToDigits = {
zero: 0,
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
six: 6,
seven: 7,
eight: 8,
nine: 9,
ten: 10,
eleven: 11,
twelve: 12,
thirteen: 13,
fourteen: 14,
fifteen: 15,
sixteen: 16,
seventeen: 17,
eighteen: 18,
nineteen: 19,
twenty: 20,
thirty: 30,
forty: 40,
fifty: 50,
sixty: 60,
seventy: 70,
eighty: 80,
ninety: 90,
hundred: 100,
thousand: 1000,
million: 1000000,
};
let parts = [];
let currentWord = '';
let index = 0;
while (index < methodName.length) {
currentWord += methodName[index].toLowerCase();
if (Object.keys(wordsToDigits).includes(currentWord)) {
parts.push(currentWord);
currentWord = '';
}
index++;
}
if (currentWord !== '') {
throw new Error(`Invalid method name: '${methodName}'. Failed to parse '${currentWord}'.`);
}
if (!parts.length) {
throw new Error(`Invalid method name: '${methodName}'. No recognizable number words found.`);
}
return this.#convertPartsToNumber(parts, wordsToDigits);
}
#convertPartsToNumber(parts, wordsToDigits) {
let total = 0;
let segment = 0;
parts.forEach(part => {
let value = wordsToDigits[part];
if (value < 100) {
segment += value;
} else {
segment = segment === 0 ? value : segment * value;
if (part === 'thousand' || part === 'million') {
total += segment;
segment = 0;
}
}
});
return total + segment;
}
}
module.exports = {
NoNumbersKeyboard: NoNumbersKeyboard,
Ltn: NoNumbersKeyboard
};