UNPKG

nnk-js

Version:

Converts written numbers into their numerical values.

96 lines (86 loc) 2.6 kB
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 };