PHP Básico

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

Função em 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.

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

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  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) && ($z 

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  0)
    {
        $output .= " point";
        for ($i = 0; $i 

Utilização:

$number = "1001";

echo convertNumber($number);

 

 

Resumo
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

Ver comentários

  • 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!

Post Recentes

Por que devo sempre manter o Magento 2 atualizado?

Segurança: Atualizações frequentes geralmente incluem patches de segurança para corrigir vulnerabilidades identificadas. Ao manter o Magento atualizado, você reduz significativamente…

1 mês atrás

Adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2

Como adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2 Injete o Magento\Framework\Message\ManagerInterface no construtor da sua…

1 mês atrás

Exibir mensagens erro/sucesso da Classe: Magento\Framework\Message\ManagerInterface

Para exibir as mensagens adicionadas na classe Magento\Framework\Message\ManagerInterface em um arquivo .phtml, você pode usar o seguinte código: <?php $objectManager…

1 mês atrás

Exportar as categorias do Magento 2 em um XML

Para criar um script no Magento 2 que exporte as categorias para um arquivo XML com o nome da categoria,…

3 meses atrás

Colocar um video como Background utilizando HTML + CSS

Para definir um vídeo MP4 como plano de fundo em um <div> usando HTML e CSS, você pode seguir estas…

4 meses atrás

Desativar o “lastname” no Magento 2

Como desativar o "lastname" no Magento 2 e Adobe Commerce Desativando a obrigatoriedade do campo Execute a SQL abaixo diretamente…

4 meses atrás