|
numToLez = '''(input_text) => { |
|
const million = 1e6; // 10^6; |
|
const billion = 1e9; // 10^9; |
|
const trillion = 1e12; // 10^12; |
|
const quadrillion = 1e15; // 10^15; |
|
const quintillion = 1e18; // 10^18; |
|
const sextillion = 1e21; // 10^21; |
|
const septillion = 1e24; // 10^24; |
|
const octillion = 1e27; // 10^27; |
|
const nonillion = 1e30; // 10^30; |
|
const atomic = { |
|
0: 'нул', |
|
1: 'сад', |
|
2: 'кьвед', |
|
3: 'пуд', |
|
4: 'кьуд', |
|
5: 'вад', |
|
6: 'ругуд', |
|
7: 'ирид', |
|
8: 'муьжуьд', |
|
9: 'кIуьд', |
|
10: 'цIуд', |
|
20: 'къад', |
|
40: 'яхцIур', |
|
// 10^2 |
|
100: 'виш', |
|
// 10^3 |
|
1000: 'агъзур', |
|
// 10^6 |
|
[million]: 'миллион', |
|
// 10^9 |
|
[billion]: 'миллиард', |
|
// 10^12 |
|
[trillion]: 'триллион', |
|
// 10^15 |
|
[quadrillion]: 'квадриллион', |
|
// 10^18 |
|
[quintillion]: 'квинтиллион', |
|
// 10^21 |
|
[sextillion]: 'секстиллион', |
|
// 10^24 |
|
[septillion]: 'септиллион', |
|
// 10^27 |
|
[octillion]: 'октиллион', |
|
// 10^30 |
|
[nonillion]: 'нониллион', |
|
}; |
|
const MINUS = 'минус'; |
|
function separateNumberIntoUnits(n) { |
|
if (n == 0) |
|
return [0]; |
|
const arr = []; |
|
let i = 1; |
|
while (n > 0) { |
|
arr.unshift((n % 10) * i); |
|
n = Math.floor(n / 10); |
|
i *= 10; |
|
} |
|
const result = groupNumberUnitsToLezgiRange(arr); |
|
return result; |
|
} |
|
const ranges = [ |
|
{ start: nonillion, end: octillion }, // nonillion to octillion |
|
{ start: octillion, end: septillion }, // octillion to septillion |
|
{ start: septillion, end: sextillion }, // septillion to sextillion |
|
{ start: sextillion, end: quintillion }, // sextillion to quintillion |
|
{ start: quadrillion, end: quintillion }, // quadrillion to quintillion |
|
{ start: trillion, end: quadrillion }, // trillion to quadrillion |
|
{ start: billion, end: trillion }, // billion to trillion |
|
{ start: million, end: billion }, // million to billion |
|
{ start: 1000, end: million }, // thousand to million |
|
]; |
|
function groupNumberUnitsToLezgiRange(arr) { |
|
let result = []; |
|
for (let range of ranges) { |
|
let sum = arr.reduce((acc, num) => { |
|
if (num >= range.start && num < range.end) { |
|
return acc + num; |
|
} |
|
return acc; |
|
}, 0); |
|
if (sum !== 0) { |
|
result.push(sum); |
|
} |
|
// Filter out the numbers that were added to sum |
|
arr = arr.filter((num) => num < range.start || num >= range.end); |
|
} |
|
// Concatenate the remaining numbers to the result |
|
result = result.concat(arr); |
|
return result; |
|
} |
|
function getTenPlusBase(num) { |
|
if (num < 10 || num >= 20) { |
|
throw new Error('Invalid number'); |
|
} |
|
if (num === 10) { |
|
return [atomic[10]]; |
|
} |
|
const base10 = atomic[10].slice(0, -2); |
|
if (num === 11 || num === 15 || num === 16) { |
|
return [base10 + 'у']; |
|
} |
|
else if (num < 15) { |
|
return [base10 + 'и']; |
|
} |
|
return [base10 + 'е']; |
|
} |
|
function getTwentyPlusBase(num) { |
|
return num === 20 ? [atomic[20]] : ['къанни']; |
|
} |
|
function getThirtyPlusBase(num) { |
|
return [...getTwentyPlusBase(num), ...getTenPlusBase(num - 20)]; |
|
} |
|
function getFourtyPlusBase(num) { |
|
return num === 40 ? [atomic[40]] : [atomic[40], 'ни']; |
|
} |
|
function getFiftyPlusBase(num) { |
|
return [...getFourtyPlusBase(num), ...getTenPlusBase(num - 40)]; |
|
} |
|
function getSixtyPlusBase(num) { |
|
return num === 60 ? [atomic[3], atomic[20]] : [atomic[3], ...getTwentyPlusBase(num)]; |
|
} |
|
function getSeventyPlusBase(num) { |
|
return [...getSixtyPlusBase(61), ...getTenPlusBase(num - 60)]; |
|
} |
|
function getEightyPlusBase(num) { |
|
return num === 80 ? [atomic[4], atomic[20]] : [atomic[4], ...getTwentyPlusBase(num)]; |
|
} |
|
function getNinetyPlusBase(num) { |
|
return [...getEightyPlusBase(81), ...getTenPlusBase(num - 80)]; |
|
} |
|
function getHundredPlusBase(num) { |
|
return num % 100 === 0 ? [atomic[100]] : [atomic[100], 'ни']; |
|
} |
|
function getHundredPlusNumCount(numCount) { |
|
if (atomic[numCount] !== undefined) { |
|
return numCount === 2 ? [atomic[numCount].slice(0, -1)] : [atomic[numCount]]; |
|
} |
|
return undefined; |
|
} |
|
function getBetweenHundredAndThousand(num, followUpNumber) { |
|
const hundredsCount = num % 100 != 0 ? num - (num % 100) : num / 100; |
|
const hundredsCountInLezgi = getHundredPlusNumCount(hundredsCount); |
|
return [...hundredsCountInLezgi, ' ', ...getHundredPlusBase(num + followUpNumber)]; |
|
} |
|
function getThousandPlusBase(num) { |
|
return num % 1000 === 0 ? [atomic[1000]] : [atomic[1000], 'ни']; |
|
} |
|
function getBetweenThousandAndMillion(num, followUpNumber) { |
|
var _a; |
|
const thousandsCount = num % 1000 != 0 ? num - (num % 1000) : num / 1000; |
|
const thousandsCountInLezgi = (_a = getHundredPlusNumCount(thousandsCount)) !== null && _a !== void 0 ? _a : getCompound(thousandsCount); |
|
return [...thousandsCountInLezgi, ' ', ...getThousandPlusBase(num + followUpNumber)]; |
|
} |
|
function getMillionPlusBase(num) { |
|
return num % million === 0 ? [atomic[million]] : [atomic[million], 'ни']; |
|
} |
|
function getBetweenMillionAndBillion(num, followUpNumber) { |
|
var _a; |
|
const millionsCount = num % million != 0 ? num - (num % million) : num / million; |
|
const millionsCountInLezgi = (_a = getHundredPlusNumCount(millionsCount)) !== null && _a !== void 0 ? _a : getCompound(millionsCount); |
|
return [...millionsCountInLezgi, ' ', ...getMillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getBillionPlusBase(num) { |
|
return num % billion === 0 ? [atomic[billion]] : [atomic[billion], 'ни']; |
|
} |
|
function getBetweenBillionAndTrillion(num, followUpNumber) { |
|
var _a; |
|
const billionsCount = num % billion != 0 ? num - (num % billion) : num / billion; |
|
const billionsCountInLezgi = (_a = getHundredPlusNumCount(billionsCount)) !== null && _a !== void 0 ? _a : getCompound(billionsCount); |
|
return [...billionsCountInLezgi, ' ', ...getBillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getTrillionPlusBase(num) { |
|
return num % trillion === 0 ? [atomic[trillion]] : [atomic[trillion], 'ни']; |
|
} |
|
function getBetweenTrillionAndQuadrillion(num, followUpNumber) { |
|
var _a; |
|
const trillionsCount = num % trillion != 0 ? num - (num % trillion) : num / trillion; |
|
const trillionsCountInLezgi = (_a = getHundredPlusNumCount(trillionsCount)) !== null && _a !== void 0 ? _a : getCompound(trillionsCount); |
|
return [...trillionsCountInLezgi, ' ', ...getTrillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getQuadrillionPlusBase(num) { |
|
return num % quadrillion === 0 ? [atomic[quadrillion]] : [atomic[quadrillion], 'ни']; |
|
} |
|
function getBetweenQuadrillionAndQuintillion(num, followUpNumber) { |
|
var _a; |
|
const quadrillionsCount = num % quadrillion != 0 ? num - (num % quadrillion) : num / quadrillion; |
|
const quadrillionsCountInLezgi = (_a = getHundredPlusNumCount(quadrillionsCount)) !== null && _a !== void 0 ? _a : getCompound(quadrillionsCount); |
|
return [...quadrillionsCountInLezgi, ' ', ...getQuadrillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getQuintillionPlusBase(num) { |
|
return num % quintillion === 0 ? [atomic[quintillion]] : [atomic[quintillion], 'ни']; |
|
} |
|
function getBetweenQuintillionAndSextillion(num, followUpNumber) { |
|
var _a; |
|
const quintillionsCount = num % quintillion != 0 ? num - (num % quintillion) : num / quintillion; |
|
const quintillionsCountInLezgi = (_a = getHundredPlusNumCount(quintillionsCount)) !== null && _a !== void 0 ? _a : getCompound(quintillionsCount); |
|
return [...quintillionsCountInLezgi, ' ', ...getQuintillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getSextillionPlusBase(num) { |
|
return num % sextillion === 0 ? [atomic[sextillion]] : [atomic[sextillion], 'ни']; |
|
} |
|
function getBetweenSextillionAndSeptillion(num, followUpNumber) { |
|
var _a; |
|
const sextillionsCount = num % sextillion != 0 ? num - (num % sextillion) : num / sextillion; |
|
const sextillionsCountInLezgi = (_a = getHundredPlusNumCount(sextillionsCount)) !== null && _a !== void 0 ? _a : getCompound(sextillionsCount); |
|
return [...sextillionsCountInLezgi, ' ', ...getSextillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getSeptillionPlusBase(num) { |
|
return num % septillion === 0 ? [atomic[septillion]] : [atomic[septillion], 'ни']; |
|
} |
|
function getBetweenSeptillionAndOctillion(num, followUpNumber) { |
|
var _a; |
|
const septillionsCount = num % septillion != 0 ? num - (num % septillion) : num / septillion; |
|
const septillionsCountInLezgi = (_a = getHundredPlusNumCount(septillionsCount)) !== null && _a !== void 0 ? _a : getCompound(septillionsCount); |
|
return [...septillionsCountInLezgi, ' ', ...getSeptillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getOctillionPlusBase(num) { |
|
return num % octillion === 0 ? [atomic[octillion]] : [atomic[octillion], 'ни']; |
|
} |
|
function getBetweenOctillionAndNonillion(num, followUpNumber) { |
|
var _a; |
|
const octillionsCount = num % octillion != 0 ? num - (num % octillion) : num / octillion; |
|
const octillionsCountInLezgi = (_a = getHundredPlusNumCount(octillionsCount)) !== null && _a !== void 0 ? _a : getCompound(octillionsCount); |
|
return [...octillionsCountInLezgi, ' ', ...getOctillionPlusBase(num + followUpNumber)]; |
|
} |
|
function getNonillionPlusBase(num) { |
|
return num % nonillion === 0 ? [atomic[nonillion]] : [atomic[nonillion], 'ни']; |
|
} |
|
function getCompound(num) { |
|
const units = separateNumberIntoUnits(num); |
|
const result = units.map((unit, i) => { |
|
if (i > 0 && |
|
unit === 7 && |
|
(units[i - 1] === 10 || |
|
units[i - 1] === 30 || |
|
units[i - 1] === 50 || |
|
units[i - 1] === 70 || |
|
units[i - 1] === 90)) { |
|
return [atomic[7].slice(1)]; |
|
} |
|
const followUpNumber = units.slice(i + 1).reduce((acc, num) => acc + num, 0); |
|
if (unit === 10) { |
|
return getTenPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 20) { |
|
return getTwentyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 30) { |
|
return getThirtyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 40) { |
|
return getFourtyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 50) { |
|
return getFiftyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 60) { |
|
return getSixtyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 70) { |
|
return getSeventyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 80) { |
|
return getEightyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 90) { |
|
return getNinetyPlusBase(unit + followUpNumber); |
|
} |
|
if (unit === 100) { |
|
return getHundredPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > 100 && unit < 1000) { |
|
return getBetweenHundredAndThousand(unit, followUpNumber); |
|
} |
|
if (unit === 1000) { |
|
return getThousandPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > 1000 && unit < million) { |
|
return getBetweenThousandAndMillion(unit, followUpNumber); |
|
} |
|
if (unit === million) { |
|
return getMillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > million && unit < billion) { |
|
return getBetweenMillionAndBillion(unit, followUpNumber); |
|
} |
|
if (unit === billion) { |
|
return getBillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > billion && unit < trillion) { |
|
return getBetweenBillionAndTrillion(unit, followUpNumber); |
|
} |
|
if (unit === trillion) { |
|
return getTrillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > trillion && unit < quadrillion) { |
|
return getBetweenTrillionAndQuadrillion(unit, followUpNumber); |
|
} |
|
if (unit === quadrillion) { |
|
return getQuadrillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > quadrillion && unit < quintillion) { |
|
return getBetweenQuadrillionAndQuintillion(unit, followUpNumber); |
|
} |
|
if (unit === quintillion) { |
|
return getQuintillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > quintillion && unit < sextillion) { |
|
return getBetweenQuintillionAndSextillion(unit, followUpNumber); |
|
} |
|
if (unit === sextillion) { |
|
return getSextillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > sextillion && unit < septillion) { |
|
return getBetweenSextillionAndSeptillion(unit, followUpNumber); |
|
} |
|
if (unit === septillion) { |
|
return getSeptillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > septillion && unit < octillion) { |
|
return getBetweenSeptillionAndOctillion(unit, followUpNumber); |
|
} |
|
if (unit === octillion) { |
|
return getOctillionPlusBase(unit + followUpNumber); |
|
} |
|
if (unit > octillion && unit < nonillion) { |
|
return getBetweenOctillionAndNonillion(unit, followUpNumber); |
|
} |
|
if (unit === nonillion) { |
|
return getNonillionPlusBase(unit + followUpNumber); |
|
} |
|
return units.length > 1 && unit === 0 ? [''] : [atomic[unit] || unit.toString()]; |
|
}); |
|
return result.flat(); //.join('').replaceAll(' ', ' ').trim(); |
|
} |
|
function getAtomicOrCompound(num) { |
|
if (atomic[num]) { |
|
return [atomic[num]]; |
|
} |
|
else { |
|
return getCompound(num); |
|
} |
|
} |
|
function numToLezgiArray(num) { |
|
if (isNaN(num)) { |
|
throw new Error('Provided value is not a number'); |
|
} |
|
if (!Number.isInteger(num)) { |
|
throw new Error('Provided number is not an integer. Currently only integers are supported!'); |
|
} |
|
const isNegative = num < 0; |
|
num = Math.abs(num); |
|
const result = getAtomicOrCompound(num) |
|
.filter((word) => word !== '') |
|
.map((word) => (word.endsWith('ни') ? [word, ' '] : word)) |
|
.flat(); |
|
return isNegative ? [MINUS, ' ', ...result] : result; |
|
} |
|
function numToLezgi(num) { |
|
const resultArray = numToLezgiArray(num); |
|
return (resultArray |
|
// .map((word) => (word.endsWith('ни') || word === MINUS ? word + ' ' : word)) |
|
.join('') |
|
.replaceAll(' ', ' ') |
|
.trim()); |
|
} |
|
|
|
function replaceNumbersWithWords(inputString) { |
|
return inputString.replaceAll(/\d+/g, (num) => numToLezgi(parseInt(num, 10))); |
|
} |
|
console.log(replaceNumbersWithWords(input_text)) |
|
return replaceNumbersWithWords(input_text) |
|
}''' |
|
|