@devix-tecnologia/numero-por-extenso
Version:
Escreve números por extenso: normais, monetários e porcentagens.
76 lines • 3.32 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getGroup = getGroup;
exports.numberInFull = numberInFull;
const nomes_js_1 = __importDefault(require("./nomesExtenso/nomes.js"));
const dezenas_js_1 = __importDefault(require("./nomesExtenso/dezenas.js"));
const casas_js_1 = __importDefault(require("./nomesExtenso/casas.js"));
/**
* Retorna o grupo numérico em extenso.
* @param number Uma string representando o número.
* @returns Uma representação em extenso do número dado.
*/
function getGroup(number) {
if (number === "100")
return "cem";
let output = "";
for (let i = 0; i < number.length; i++) {
const c = number[i];
if (output) {
if (c === "0")
continue;
output += " e ";
}
if (((number.length === 2 && i === 0) || (number.length === 3 && i === 1)) &&
c === "1")
return output + dezenas_js_1.default[+number[i + 1]];
output += nomes_js_1.default[number.length - i - 1][+c];
}
return output;
}
/**
* Converte um número inteiro em sua representação por extenso.
* @param numero O número a ser convertido.
* @returns A representação por extenso do número.
*/
function numberInFull(numero) {
let output = [];
let numbers = [];
// Responsável por dividir o número em partes menores de até três dígitos cada e em seguida,
// para cada parte, determinar o nome correspondente em extenso usando a função getGroup
let number = numero.toString();
while (number.length > 0) {
let piece = number.length <= 3 ? number : number.slice(-3);
numbers.push({ numero: +piece, nome: getGroup(piece) });
number = number.length - 3 > 0 ? number.slice(0, -3) : "";
}
// Verifica se há apenas uma parte no número e se esse único número é zero.
// Se ambas as condições forem verdadeiras, significa que o número original é zero.
if (numbers.length === 1 && numbers[0].numero === 0)
return numbers[0].nome;
// Esta parte do código adiciona ao array output os nomes das partes do número que não são zero,
// juntamente com os nomes das casas correspondentes, formatados adequadamente.
for (let i = numbers.length - 1; i > 0; i--) {
if (numbers[i].numero !== 0) {
output.push(numbers[i].nome +
" " +
(numbers[i].numero === 1 ? casas_js_1.default[i].replace("ões", "ão") : casas_js_1.default[i]));
}
}
// Essa parte do código trata de adicionar a parte do número correspondente à casa mais significativa (à esquerda)
// ao array output, considerando os casos especiais onde a palavra "e" precisa ser adicionada antes dessa parte do número.
if (numbers.length && numbers[0].numero > 0) {
output.push(`${numbers.length > 1 &&
(numbers[0].numero < 100 || numbers[0].numero % 100 === 0)
? "e "
: ""}${numbers[0].nome}`);
}
else if (output.length > 1) {
output.splice(output.length - 1, 0, "e");
}
return output.join(" ");
}
//# sourceMappingURL=common.js.map