
Função em PHP para escrever um valor por extenso, exemplo “R$ 1.000,00” para “um mil reais”.
Infelizmente o PHP não possuí uma função nativa que permita realizar essa operação.
Ter uma função para escrever o valor por extenso é muito útil para geração de recibos e comprovantes, aonde o valor escrito apenas numericamente pode ser rasurado, invalidando o recibo impresso.
Números por extenso devem ser escritos com os numerais cardinais até ao dez e os numerais ordinais até ao décimo, também temos os numerais cardinais cem e mil que também devem ser escritos por extenso, além dos numerais fracionários.
Exemplo: para o valor R$ 1.233,33, temos um mil e duzentos e trinta e três reais e trinta e três centavos.
Função corrigida, que irá exibir o número por inteiro, incluindo os centavos.
function valorPorExtenso($valor=0) {
$singular = array(“centavo”, “real”, “mil”, “milhão”, “bilhão”, “trilhão”, “quatrilhão”);
$plural = array(“centavos”, “reais”, “mil”, “milhões”, “bilhões”, “trilhões”,”quatrilhões”);
$c = array(“”, “cem”, “duzentos”, “trezentos”, “quatrocentos”,”quinhentos”, “seiscentos”, “setecentos”, “oitocentos”, “novecentos”);
$d = array(“”, “dez”, “vinte”, “trinta”, “quarenta”, “cinquenta”,”sessenta”, “setenta”, “oitenta”, “noventa”);
$d10 = array(“dez”, “onze”, “doze”, “treze”, “quatorze”, “quinze”,”dezesseis”, “dezesete”, “dezoito”, “dezenove”);
$u = array(“”, “um”, “dois”, “três”, “quatro”, “cinco”, “seis”,”sete”, “oito”, “nove”);
$z=0;
$valor = number_format($valor, 2, “.”, “.”);
$inteiro = explode(“.”, $valor);
for($i=0;$i 0 ? 1 : 2);
for ($i=0;$i 100) && ($valor < 200)) ? "cento" : $c[$valor[0]]; $rd = ($valor[1] < 2) ? "" : $d[$valor[1]]; $ru = ($valor > 0) ? (($valor[1] == 1) ? $d10[$valor[2]] : $u[$valor[2]]) : “”;
$r = $rc.(($rc && ($rd || $ru)) ? ” e ” : “”).$rd.(($rd && $ru) ? ” e ” : “”).$ru;
$t = count($inteiro)-1-$i;
$r .= $r ? ” “.($valor > 1 ? $plural[$t] : $singular[$t]) : “”;
if ($valor == “000”)$z++; elseif ($z > 0) $z–;
if (($t==1) && ($z>0) && ($inteiro[0] > 0)) $r .= (($z>1) ? ” de ” : “”).$plural[$t];
$rt = (!isset($rt)) ? “” : $rt;
if ($r) $rt = $rt . ((($i > 0) && ($i < = $fim) && ($inteiro[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? ", " : " e ") : " ") . $r; } return($rt ? $rt : "zero");
} Para exibir os valores em centavos
echo valorPorExtenso('1233.33'); function valor_por_extenso( $v ){
$v = filter_var($v, FILTER_SANITIZE_NUMBER_INT);
$sin = array("centavo", "real", "mil", "milhão", "bilhão", "trilhão", "quatrilhão");
$plu = array("centavos", "reais", "mil", "milhões", "bilhões", "trilhões","quatrilhões");
$c = array("", "cem", "duzentos", "trezentos", "quatrocentos","quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos");
$d = array("", "dez", "vinte", "trinta", "quarenta", "cinquenta","sessenta", "setenta", "oitenta", "noventa");
$d10 = array("dez", "onze", "doze", "treze", "quatorze", "quinze","dezesseis", "dezesete", "dezoito", "dezenove");
$u = array("", "um", "dois", "três", "quatro", "cinco", "seis","sete", "oito", "nove");
$z = 0;
$v = number_format( $v, 2, ".", "." );
$int = explode( ".", $v );
for ( $i = 0; $i < count( $int ); $i++ )
{
for ( $ii = mb_strlen( $int[$i] ); $ii < 3; $ii++ )
{
$int[$i] = "0" . $int[$i];
}
}
$rt = null;
$fim = count( $int ) - ($int[count( $int ) - 1] > 0 ? 1 : 2);
for ( $i = 0; $i < count( $int ); $i++ )
{
$v = $int[$i];
$rc = (($v > 100) && ($v < 200)) ? "cento" : $c[$v[0]];
$rd = ($v[1] < 2) ? "" : $d[$v[1]];
$ru = ($v > 0) ? (($v[1] == 1) ? $d10[$v[2]] : $u[$v[2]]) : "";
$r = $rc . (($rc && ($rd || $ru)) ? " e " : "") . $rd . (($rd && $ru) ? " e " : "") . $ru;
$t = count( $int ) - 1 - $i;
$r .= $r ? " " . ($v > 1 ? $plu[$t] : $sin[$t]) : "";
if ( $v == "000")
$z++;
elseif ( $z > 0 )
$z--;
if ( ($t == 1) && ($z > 0) && ($int[0] > 0) )
$r .= ( ($z > 1) ? " de " : "") . $plu[$t];
if ( $r )
$rt = $rt . ((($i > 0) && ($i <= $fim) && ($int[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? ", " : " e ") : " ") . $r;
}
$rt = mb_substr( $rt, 1 );
return($rt ? trim( $rt ) : "zero");
} echo valor_por_extenso("12300500"); Output: doze milhões, trezentos mil e quinhentos reais
echo valor_por_extenso("1002"); Output: um mil e dois reais
echo valor_por_extenso("999999"); Output: novecentos e noventa e nove mil e novecentos e noventa e nove reais
O conjunto de funções abaixo irá te ajudar a escrever o número por extenso em Inglês.
function convertNumber($number)
{
list($integer, $fraction) = explode(".", (string) $number);
$output = "";
if ($integer{0} == "-")
{
$output = "negative ";
$integer = ltrim($integer, "-");
}
else if ($integer{0} == "+")
{
$output = "positive ";
$integer = ltrim($integer, "+");
}
if ($integer{0} == "0")
{
$output .= "zero";
}
else
{
$integer = str_pad($integer, 36, "0", STR_PAD_LEFT);
$group = rtrim(chunk_split($integer, 3, " "), " ");
$groups = explode(" ", $group);
$groups2 = array();
foreach ($groups as $g)
{
$groups2[] = convertThreeDigit($g{0}, $g{1}, $g{2});
}
for ($z = 0; $z < count($groups2); $z++)
{
if ($groups2[$z] != "")
{
$output .= $groups2[$z] . convertGroup(11 - $z) . (
$z < 11
&& !array_search('', array_slice($groups2, $z + 1, -1))
&& $groups2[11] != ''
&& $groups[11]{0} == '0'
? " and "
: ", "
);
}
}
$output = rtrim($output, ", ");
}
if ($fraction > 0)
{
$output .= " point";
for ($i = 0; $i < strlen($fraction); $i++)
{
$output .= " " . convertDigit($fraction{$i});
}
}
return $output;
}
function convertGroup($index)
{
switch ($index)
{
case 11:
return " decillion";
case 10:
return " nonillion";
case 9:
return " octillion";
case 8:
return " septillion";
case 7:
return " sextillion";
case 6:
return " quintrillion";
case 5:
return " quadrillion";
case 4:
return " trillion";
case 3:
return " billion";
case 2:
return " million";
case 1:
return " thousand";
case 0:
return "";
}
}
function convertThreeDigit($digit1, $digit2, $digit3)
{
$buffer = "";
if ($digit1 == "0" && $digit2 == "0" && $digit3 == "0")
{
return "";
}
if ($digit1 != "0")
{
$buffer .= convertDigit($digit1) . " hundred";
if ($digit2 != "0" || $digit3 != "0")
{
$buffer .= " and ";
}
}
if ($digit2 != "0")
{
$buffer .= convertTwoDigit($digit2, $digit3);
}
else if ($digit3 != "0")
{
$buffer .= convertDigit($digit3);
}
return $buffer;
}
function convertTwoDigit($digit1, $digit2)
{
if ($digit2 == "0")
{
switch ($digit1)
{
case "1":
return "ten";
case "2":
return "twenty";
case "3":
return "thirty";
case "4":
return "forty";
case "5":
return "fifty";
case "6":
return "sixty";
case "7":
return "seventy";
case "8":
return "eighty";
case "9":
return "ninety";
}
} else if ($digit1 == "1")
{
switch ($digit2)
{
case "1":
return "eleven";
case "2":
return "twelve";
case "3":
return "thirteen";
case "4":
return "fourteen";
case "5":
return "fifteen";
case "6":
return "sixteen";
case "7":
return "seventeen";
case "8":
return "eighteen";
case "9":
return "nineteen";
}
} else
{
$temp = convertDigit($digit2);
switch ($digit1)
{
case "2":
return "twenty-$temp";
case "3":
return "thirty-$temp";
case "4":
return "forty-$temp";
case "5":
return "fifty-$temp";
case "6":
return "sixty-$temp";
case "7":
return "seventy-$temp";
case "8":
return "eighty-$temp";
case "9":
return "ninety-$temp";
}
}
}
function convertDigit($digit)
{
switch ($digit)
{
case "0":
return "zero";
case "1":
return "one";
case "2":
return "two";
case "3":
return "three";
case "4":
return "four";
case "5":
return "five";
case "6":
return "six";
case "7":
return "seven";
case "8":
return "eight";
case "9":
return "nine";
}
} Utilização:
$number = "1001"; echo convertNumber($number);
A grid do seu módulo monta o cabeçalho e não traz linha nenhuma. Registre a collection do UI component listing…
Pare de varrer o resultado do SELECT com foreach para achar uma linha. Veja as três assinaturas do array_column e…
Jogou o .woff2 em assets/fonts e a fonte não aparece no seletor de tipografia? Falta o bloco fontFamilies com fontFace…
O setup:upgrade parou no meio de um módulo e a loja ficou em manutenção. Veja como liberar o processo, limpar…
A rota abre no Windows e devolve 404 no servidor Linux. Veja os três culpados: nome de arquivo com caixa…
Recebeu um pedido de acesso aos dados pessoais e o prazo está correndo? Use Ferramentas > Exportar dados pessoais e…
Ver comentários
Parabéns pela iniciativa, Excelente.
Parabéns pela iniciativa amigo
Excelente função! Funcionou perfeitamente para mim! Para funcionar com centavos, a dica é remover a primeira linha: $v = filter_var($v, FILTER_SANITIZE_NUMBER_INT);
Abraços!
Nossa massa demais o artigo, recomendo muito.
curti muito bem feito e facil de entender, valeu
Oi Roger,
Muito boa essa função parabéns!
Só não estou conseguindo exibir os centavos, pode ajudar?
Tentei de várias maneiras aplicar no exemplo que você deu mas não sai os centavos:
echo valor_por_extenso(1.233,33)."";
um mil e duzentos e trinta e três reais
echo valor_por_extenso(1233,33)."";
um mil e duzentos e trinta e três reais
echo valor_por_extenso('1.233.33')."";
cento e vinte e três mil e trezentos e trinta e três reais
echo valor_por_extenso('1.233,33')."";
cento e vinte e três mil e trezentos e trinta e três reais
Boa tarde Danilo,
Utilize este código:
/***************************************/
function valorPorExtenso($valor=0) {
$singular = array("centavo", "real", "mil", "milhão", "bilhão", "trilhão", "quatrilhão");
$plural = array("centavos", "reais", "mil", "milhões", "bilhões", "trilhões","quatrilhões");
$c = array("", "cem", "duzentos", "trezentos", "quatrocentos","quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos");
$d = array("", "dez", "vinte", "trinta", "quarenta", "cinquenta","sessenta", "setenta", "oitenta", "noventa");
$d10 = array("dez", "onze", "doze", "treze", "quatorze", "quinze","dezesseis", "dezesete", "dezoito", "dezenove");
$u = array("", "um", "dois", "três", "quatro", "cinco", "seis","sete", "oito", "nove");
$z=0;
$valor = number_format($valor, 2, ".", ".");
$inteiro = explode(".", $valor);
$count = count($inteiro);
for($i=0;$i 0 ? 1 : 2);
for ($i=0;$i 100) && ($valor 0) ? (($valor[1] == 1) ? $d10[$valor[2]] : $u[$valor[2]]) : "";
$r = $rc.(($rc && ($rd || $ru)) ? " e " : "").$rd.(($rd && $ru) ? " e " : "").$ru;
$t = count($inteiro)-1-$i;
$r .= $r ? " ".($valor > 1 ? $plural[$t] : $singular[$t]) : "";
if ($valor == "000")$z++; elseif ($z > 0) $z--;
if (($t==1) && ($z>0) && ($inteiro[0] > 0)) $r .= (($z>1) ? " de " : "").$plural[$t];
$rt = (!isset($rt)) ? "" : $rt;
if ($r) $rt = $rt . ((($i > 0) && ($i 0) && ($z
Excelente trabalho Roger, além dos tutoriais de magento estou aproveitando bastante essas dicas valiosas sobre o PHP!