Função para escrever o valor por extenso utilizando PHP

Função em PHP para escrever um valor por extenso, exemplo “R$ 1.000,00” para “um mil reais”.

escrevendo número e valor por extenso com PHP

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.

Como escrever os números por extenso no PHP?

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.

Primeira função

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');

Função alternativa:

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");
}

Utilizando a função:

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

Valor por extenso em Inglês

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);

 

 

Resumo
Função para escrever o valor por extenso utilizando o PHP
Nome do Artigo
Função para escrever o valor por extenso utilizando o PHP
Descrição
Utilizando o PHP para escrever números e valores por extenso
Autor
Editor
Roger Mauricio Takemiya
Logo do Editor

6 comentários sobre “Função para escrever o valor por extenso utilizando PHP

  1. 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!
  2. 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
    1. 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<$count;$i++) for($ii=strlen($inteiro[$i]);$ii<3;$ii++) $inteiro[$i] = "0".$inteiro[$i]; // $fim identifica onde que deve se dar junção de centenas por "e" ou por "," ???? $fim = count($inteiro) - ($inteiro[count($inteiro)-1] > 0 ? 1 : 2); for ($i=0;$i < count($inteiro);$i++) { $valor = $inteiro[$i]; $rc = (($valor > 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"); } /***************************************/ echo valorPorExtenso('1233.33'); /***************************************/

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *