/* */ class Extenso { constructor (valor) { this.valor = valor; this.unidades = ["zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove"]; this.especiais = ["dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezesete", "dezoito", "dezenove"]; this.dezenas = ["zero", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"]; this.centenas = ["zero", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos"]; this.milhares = ["", "mil", "milhão", "bilhão", "trilhão"]; this.centavos = ()=>{ var cents = (this.valor * 100) % 100; cents = Math.floor(cents); switch (cents) { case 0: return ""; case 1: return "um centavo"; default: return this.gerarGrupo(cents) + " centavos"; } } this.gerar = () => { let valorStr = String(this.valor); let partes = valorStr.split("."); var centavos; var reais; var real_reais; var centavo_centavos; if (partes.length == 2) { reais = partes[0]; centavos = partes[1]; if (centavos.length == 1) centavos = centavos + "0"; } else { reais = partes[0]; centavos = "00"; } switch (parseInt(centavos)) { case 0: centavo_centavos = ""; break; case 1: centavo_centavos = " centavo"; break; default: centavo_centavos = " centavos"; } switch (parseInt(reais)) { case 0: real_reais = ""; break; case 1: real_reais = " real"; break; default: real_reais = " reais"; } while (reais.length % 3 != 0) { reais = '0' + reais; } while (centavos.length % 2 != 0) { centavos = centavos + '0'; // sim, eh ao contrario, pois 0.3 são trinta centavos e nao 3 centavos ... } var unidades = reais.match(/.{3}(?=..)|.+/g) var resultado = []; // reais ... var i = 0; while (i < unidades.length) { var parte = parseInt(unidades[i]); if (parte > 0) { resultado.push(this.gerarGrupo(parte) + " " + this.milhares[unidades.length - i - 1]); } i++; } var resultado_reais = resultado.join(" e ") + real_reais; resultado = []; resultado.push(resultado_reais); // centavos ... if (!centavos == "00") { var c = parseInt(centavos); resultado.push(this.gerarGrupo(c) + centavo_centavos); } var resultadoFinal = resultado.join(" e "); // limpeza final ... resultadoFinal = resultadoFinal.replace(/e zero/g, " "); resultadoFinal = resultadoFinal.replace(/e[ ]+nao_colocar_e[ ]+/g, " "); resultadoFinal = resultadoFinal.replace(/nao_colocar_e[ ]+/g, " "); resultadoFinal = resultadoFinal.replace(/[ ]+/g, " "); resultadoFinal = resultadoFinal.replace(/^[ ]+/g, ""); return resultadoFinal; } this.gerarGrupo = (valor) => { let strValor = String(valor); if (valor == 0) { return "zero"; } if (strValor.length == 1) { return this.unidades[valor]; } if (strValor.length == 2) { // vejo se sao casos especiais if (strValor.charAt(0) == '1') { return this.especiais[valor % 10]; } else { return this.dezenas[parseInt(strValor.charAt(0))] + " e " + this.unidades[parseInt(strValor.charAt(1))]; } } if (strValor.length == 3) { if (strValor == "100") { return "cem"; } else { return "nao_colocar_e " + this.centenas[parseInt(strValor.charAt(0))] + " e " + this.gerarGrupo(valor % 100); } } return "nao sei ainda"; } } } Number.prototype.porExtenso = function() { var porExtenso = new Extenso(this); return porExtenso.gerar(); }