
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);
Criou parts/header.html e o Editor de Site não lista a parte? Declare templateParts no theme.json e apague a versão salva…
Como matar o aviso "Image elements do not have explicit width and height" do Lighthouse trocando o img manual do…
O primeiro POST via AJAX passa e o segundo estoura 403 porque o token foi regenerado. Envie o hash no…
O certbot diz que renovou, o navegador insiste que o certificado expirou. Compare as datas com openssl e crie o…
O campo aparece cinza no painel avisando que o valor vem de arquivo? Descubra o caminho da chave, remova do…
Chamar array_filter sem callback descarta 0, '0' e false junto com os vazios. Veja o callback certo, o ARRAY_FILTER_USE_BOTH 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!