Você está na página 1de 4

<?

php

$valor = $row_recibo['recibo_valor'];

/* Criado em : 12/2000
Autor: Paulo Marote - paulomarote@altavista.com
*/
function centena($valor) {
/*
Finalidade: Mostra por extenso um $valor entre 1 e 999
$genero pode ser "m" para masculino ou qualquer
outra coisa para feminino
A estrutura desta fun��o � a seguinte:
caso o n�mero seja igual a 0 ou 100 (casos especiais), simplesmente
retorna a string "zero" ou "cem". Caso contr�rio inicia o processamento.
O array multidimensional $formula cont�m:
$formula[0][...] - lista das centenas
$formula[1][...] - lista das dezenas
$formula[2][...] - lista das unidades
$formula[3][...] - valores entre onze e dezenove (caso especial)
A string $centexte vai ser montada conforme o valor dado
para formar o n�mero por extenso
Atrav�s do loop for, o valor por extenso � montado conforme
o primeiro, segundo e terceiro d�gito da centena (001 a 999)
� colocado convenientemente os espa�os e a conjun��o "e"
Caso o segundo d�gito seja 1 e o terceiro seja entre 1 e 9,
� executado o caso especial ($formula[3][...]) e o loop for
� abandonado
*/
if ($valor == 0 || $valor == 100) {
return $valor == 0 ? "" : "cem";
}
else {
$formula = array(
0 => array(
"cento", "duzentos", "trezentos",
"quatrocentos", "quinhentos", "seiscentos",
"setecentos", "oitocentos", "novecentos"
),
1 => array(
"dez", "vinte", "trinta",
"quarenta", "cinq�enta", "sessenta",
"setenta", "oitenta", "noventa"
),
2 => array(
"um", "dois", "tr�s",
"quatro", "cinco", "seis",
"sete", "oito", "nove"
),
3 => array(
"onze", "doze", "treze",
"quatorze", "quinze", "dezesseis",
"dezessete", "dezoito", "dezenove"
)
);
$centexte = "";
/* as duas linhas abaixo montam a string $strcent, que nada
mais � o valor dado em formato string com exatamente tr�s
caracteres, com um ou dois zeros � esquerda caso seja
menor ou igual a 99 ou 9, respectivamente */
$strcent = "000" . $valor;
$strcent = substr($strcent, strlen($strcent) - 3, 3);

// leitura dos tr�s d�gitos


for ($i = 0; $i <= 2; $i++) {

// l� o d�gito e s� mostra se estiver entre 1 e 9


$digi = substr($strcent, $i, 1);
if ($digi >=1 && $digi <= 9) {

// se j� foi mostrado algum n�mero, coloca " e "


if ($centexte != "") $centexte = $centexte . " e ";

// esta parte verifica o caso especial (entre 11 e 19)


if ($i == 1 && $digi == 1) {
$digiaux = substr($strcent, 2, 1);
if ($digiaux >=1 && $digiaux <= 9) {
$centexte = $centexte . $formula[3][$digiaux - 1];
break;
}
}

// caso n�o seja caso especial, processa normalmente


$centexte = $centexte . $formula[$i][$digi - 1];
}
}

// muda para feminino, caso necess�rio


if ($genero != "m") {
$centexte = ereg_replace("tas", "tos", $centexte);
}
// retorna o valor por extenso
return $centexte;
}
}

function extenso($valor, $genero = "m") {


/*
finalidade : mostra por extenso qualquer valor
$valor -> num�rico cujo valor por extenso deseja ser mostrado
$genero -> "m" = masculino ; "f" = feminino
*/
$valor = floor($valor);
$extenso = "";
$formula = array(
1 => array(" mil ", " mil "),
2 => array(" milh�es ", " milh�o "),
3 => array(" bilh�es ", " bilh�o "),
4 => array(" trilh�es ", " trilh�o "));
// executa o loop 4 vezes, chamando a fun��o centena
// e concatenando com trilh�es, bilh�es, milh�es ou
// mil, conforme o valor de $i
for ($i = 4; $i >=1; $i--) {
if ($valor >= pow(10, $i * 3)) {
// separa a centena
$valaux = floor($valor / pow(10, $i * 3));
$extenso .= centena($valaux, $genero);
// concatena conforme singular ou plural
$extenso .= ($valaux < 2) ? $formula[$i][1] : $formula[$i][0];
// diminui o valor, retirando a centena j� processada
$valor -= ($valaux * pow(10, $i * 3));
}
}
// �ltimo processo : a centena menor que mil
$straux = centena($valor, $genero);
if ($genero != "m") {
$straux = ereg_replace("um", "uma", $straux);
$straux = ereg_replace("dois", "duas", $straux);
}
$extenso .= $straux;
return $extenso;
}

function moeda($valor, $genero = "m", $inteiros, $inteirop, $centavoss, $centavosp)


{
/*
finalidade : mostra $valor por extenso colocando
a moeda desejada.
$genero = id�ntico a extenso (exemplo de moeda no
feminino -> peseta)
$inteiros -> valor do "inteiro" da moeda no singular Ex: "real"
$inteirop -> valor do "inteiro" da moeda no plural Ex: "reais"
$centavoss -> valor dos "centavos" da moeda no singular Ex: "centavo"
$centavosp -> valor dos "centavos" da moeda no plural Ex: "centavos"
*/
// primeiro constr�i o valor inteiro
$valaux = floor($valor);
$moeda = extenso($valaux, $genero) . " ";
$moeda .= $valaux < 2 ? $inteiros : $inteirop;
// concatena com o valor dos centavos
// foi colocado + 0.001 por um erro de arredondamento
// do meu PHP. Espero que seja corrigido em vers�es mais novas
$valaux = floor(($valor - $valaux + 0.001) * 100);
if ($valaux > 0) {
$moeda .= " e " . extenso($valaux, $genero) . " ";
$moeda .= $valaux < 2 ? $centavoss : $centavosp;
}
return $moeda;
}

// formul�rio
/*
echo "<form method=\"post\" action=\"$PHP_SELF\">";
echo "Digite o n�mero: <input type=text name=\"valor\"";
echo isset($valor) ? "value = \"$valor\"" : "";
echo "> Tipo:<input type=\"radio\" name=\"valtipo\" value=\"m\"";
if (!isset($valtipo)) $valtipo = "m";
echo $valtipo == "m" ? "CHECKED" : "";
echo ">Masculino<input type=\"radio\" name=\"valtipo\" value=\"f\"";
echo $valtipo == "f" ? "CHECKED" : "";
echo ">Feminino<br>";
*/
/* caso j� tenha sido digitado anteriormente, mostra
o valor por extenso */
if (isset($valor)) {
// permite que seja usado v�rgula ou ponto. Se for
// o primeiro caso, converte a v�rgula para ponto.
$valor = ereg_replace (",", ".", $valor);
//echo extenso($valor, $valtipo);
echo moeda($valor, "m", "real", "reais", "centavo", "centavos");
}

?>

Você também pode gostar