Transforma valor R$ por extenso


Olá seguidores do php!
Bom eu fiz uma aplicação a onde eu tinha que transforma um valor Decimal em string então fiz uma pesquisa de na internet e achei um muito interessante, ele faz muito bem essa função, eu  fiz os teste aprovei, meus parabéns para que criou.
Veja o código:
function extenso($valor = 0, $maiusculas = false) {

$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;
$rt = "";

$valor = number_format($valor, 2, ".", ".");
$inteiro = explode(".", $valor);
for($i=0;$i<count($inteiro);$i++)
for($ii=strlen($inteiro[$i]);$ii<3;$ii++)
$inteiro[$i] = "0".$inteiro[$i];

$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];
if ($r) $rt = $rt . ((($i > 0) && ($i <= $fim) &&
($inteiro[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? ", " : " e ") : " ") . $r;
}

if(!$maiusculas){
return($rt ? $rt : "zero");
} else {

if ($rt) $rt=ereg_replace(" E "," e ",ucwords($rt));
return (($rt) ? ($rt) : "Zero");
}

}

Exemplo de como usar a função
$valor = 112344;
$dim = extenso($valor);
$dim = ereg_replace(" E "," e ",ucwords($dim));

$valor = number_format($valor, 2, ",", ".");

echo "R$ $valor
$dim";

Comentários

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
  2. Fiz algumas alterações para a questão do maiusculo e minusculo.

    function extenso($valor = 0, $maiusculas = false) {
    if(!$maiusculas){
    $singular = ["centavo", "real", "mil", "milhão", "bilhão", "trilhão", "quatrilhão"];
    $plural = ["centavos", "reais", "mil", "milhões", "bilhões", "trilhões", "quatrilhões"];
    $u = ["", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove"];
    }else{
    $singular = ["CENTAVO", "REAL", "MIL", "MILHÃO", "BILHÃO", "TRILHÃO", "QUADRILHÃO"];
    $plural = ["CENTAVOS", "REAIS", "MIL", "MILHÕES", "BILHÕES", "TRILHÕES", "QUADRILHÕES"];
    $u = ["", "um", "dois", "TRÊS", "quatro", "cinco", "seis", "sete", "oito", "nove"];
    }

    $c = ["", "cem", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos"];
    $d = ["", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"];
    $d10 = ["dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezesete", "dezoito", "dezenove"];

    $z = 0;
    $rt = "";

    $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];
    if ($r) $rt = $rt . ((($i > 0) && ($i <= $fim) && ($inteiro[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? ", " : " e ") : " ") . $r;
    }

    if(!$maiusculas){
    $return = $rt ? $rt : "zero";
    } else {
    if ($rt) $rt = ereg_replace(" E "," e ",ucwords($rt));
    $return = ($rt) ? ($rt) : "Zero" ;
    }

    if(!$maiusculas){
    return ereg_replace(" E "," e ",ucwords($return));
    }else{
    return strtoupper($return);
    }
    }

    $valor = 405.63;
    $dim = extenso($valor);

    $valor = number_format($valor, 2, ",", ".");

    echo "R$ ".$valor." = ".$dim;

    ResponderExcluir
  3. que bom ajudou mas isso não é necessário pois o php tem funções pra isso...

    ResponderExcluir
    Respostas
    1. Quais funções do php retornam o valor em extenso em português? Obrigado!

      Excluir
  4. Não tem você tem que usar essa função acima mas vc pode usar o para formatar as funções:
    strtoupper() - Converte uma string para maiúsculas
    ucfirst() - Converte para maiúscula o primeiro caractere de uma string
    ucwords() - Converte para maiúsculas o primeiro caractere de cada palavra
    mb_strtolower() - Make a string lowercase

    ResponderExcluir
  5. Bom dia,
    Quero usar essa função em uma factura, "invoice_details.php". Sera que tenho que ter mais algum outro ficheiro para complementar?
    Como devo emplementar essa função?
    Obrigado

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Criar um arquivo html com php

Excluir um registro de uma tabela usando php+mysql+jQuery