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 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) && ($zPara 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 0 ? 1 : 2); for ( $i = 0; $i 100) && ($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 0) && ($zUtilizando 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 0) { $output .= " point"; for ($i = 0; $iUtilização:
$number = "1001"; echo convertNumber($number);
Resumo Nome do ArtigoFunção para escrever o valor por extenso utilizando o PHPDescriçãoUtilizando o PHP para escrever números e valores por extensoAutorRoger Mauricio TakemiyaEditorRoger Mauricio TakemiyaLogo do Editor
Segurança: Atualizações frequentes geralmente incluem patches de segurança para corrigir vulnerabilidades identificadas. Ao manter o Magento atualizado, você reduz significativamente…
Como adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2 Injete o Magento\Framework\Message\ManagerInterface no construtor da sua…
Para exibir as mensagens adicionadas na classe Magento\Framework\Message\ManagerInterface em um arquivo .phtml, você pode usar o seguinte código: <?php $objectManager…
Para criar um script no Magento 2 que exporte as categorias para um arquivo XML com o nome da categoria,…
Para definir um vídeo MP4 como plano de fundo em um <div> usando HTML e CSS, você pode seguir estas…
Como desativar o "lastname" no Magento 2 e Adobe Commerce Desativando a obrigatoriedade do campo Execute a SQL abaixo diretamente…
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!