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

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

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