Passar para o conteúdo principal

Como criar um campo de valor por extenso

Como adicionar um campo de valores escritos por extenso no seu formulário de negócio, proposta, venda ou documento.

João Pedro Ledo avatar
Escrito por João Pedro Ledo
Atualizado há mais de 2 meses

Disponibilizamos uma fórmula em JavaScript que permite transformar valores numéricos em suas representações por extenso, sem necessidade de desenvolver uma API externa ou saber programar.


Como configurar

Nesse exemplo criarei um campo no formulário de negócios, mas o mesmo pode ser feito em clientes, propostas, vendas, documentos ou produtos (qualquer campo com fórmulas).

Veja agora o passo a passo de como realizar essa configuração:

1. Crie um campo de texto simples;

2. Edite a fórmula em "Configurações avançadas":

Print da tela de criação/edição de campo destacando o tipo de "Texto simples", título "Valor por extenso" e o botão "Configurar" em Fórmula

3. Selecione o tipo "Fórmula simples":

4. Na fórmula, insira este código :

(function (valor, monetario) {
if(parseFloat(valor) == 0){
return "Zero"
}

const unidades = Array.of("", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove");
const dezenas = Array.of("", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa");
const especiais = Array.of("dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove");
const centenas = Array.of("", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos");

const escalas = Array.of(
"",
"mil",
Array.of("milhão", "milhões"),
Array.of("bilhão", "bilhões"),
Array.of("trilhão", "trilhões"),
Array.of("quadrilhão", "quadrilhões"),
Array.of("quintilhão", "quintilhões"),
Array.of("sextilhão", "sextilhões"),
Array.of("setilhão", "setilhões"),
Array.of("octilhão", "octilhões"),
Array.of("nonilhão","nonilhões")
);

function triplaParaTexto(n) {
n = parseInt(n, 10);
if (n === 0) return "";

let c = Math.floor(n / 100);
let d = Math.floor((n % 100) / 10);
let u = n % 10;
let texto = "";

if (n === 100) return "cem";

if (c > 0) texto += centenas.at(c);
if (d === 1) {
texto += (texto ? " e " : "") + especiais.at(u);
} else {
if (d > 0) texto += (texto ? " e " : "") + dezenas.at(d);
if (u > 0) texto += (texto ? " e " : "") + unidades.at(u);
}

return texto;
}

function inteiroParaExtenso(n) {
if (n === 0) return "zero";

let partes = new Array();
let blocos = new Array();

// Quebrar número em blocos de 3 dígitos da direita para a esquerda
while (n > 0) {
blocos.push(n % 1000);
n = Math.floor(n / 1000);
}

for (let i = blocos.length - 1; i >= 0; i--) {
let bloco = blocos.at(i);
if (bloco === 0) continue;

let texto = triplaParaTexto(bloco);

let escala = escalas.at(i);
if (i === 0) {
partes.push(texto);
} else if (i === 1) {
partes.push(texto + " mil");
} else {
let nome = bloco === 1 ? escala.at(0) : escala.at(1);
partes.push(texto + " " + nome);
}
}

// Juntar com "e" se necessário
let final = partes.join(" ");
return final;
}

function centavosParaExtenso(n) {
if (n === 0) return "";
return inteiroParaExtenso(n) + (n === 1 ? " centavo" : " centavos");
}

valor = parseFloat(valor).toFixed(2);
let partes = valor.split('.').map(Number);
let inteiro = partes.at(0);
let centavos = partes.at(1);

let extenso = "";

if(monetario){
if (inteiro > 0) {
extenso += inteiroParaExtenso(inteiro) + (inteiro === 1 ? " real" : " reais");
}

if (centavos > 0) {
if (extenso) extenso += " e ";
extenso += centavosParaExtenso(centavos);
}
} else {
extenso += inteiroParaExtenso(inteiro)
}

return extenso.charAt(0).toUpperCase() + extenso.slice(1);
})([CAMPO], true)

5. Substitua "[CAMPO]", no final da fórmula, pelo campo que possui o valor a ser escrito por extenso.

Você pode selecionar um campo assim:

Resultado

Na configuração:

No formulário:


Caso necessite de informações adicionais ou suporte, estamos à disposição para ajudar!

Respondeu à sua pergunta?