Valor por Extenso

Amigos,

Estou precisando salvar ou mostrar um valor por extenso, como posso fazer?

Tenho um campo do tipo numeric(10,2) e gostaria de na view visualizar este valor por extenso, se não desse pra fazer assim poderia até mesno uma função que transformasse esse valor em extenso e pudesse jogar ele no banco.

Qual a melhor maneira de fazer isto??

Desde já agradeço a todos.

Bem amigos, não consegui visualizar o número convertendo-o do banco para extenso, mais consegui colocá-lo no BD já por extenso automaticamente, o usuário digita o número e ele converte já jogando ele para o BD por extenso. A quem interessar deixo o exemplo, eu precisei pois fiz um formulário tipo recibo onde terei o valor por extenso e será impresso pelo browser mesmo.

Ficou assim:




	protected function beforeSave() {

    	if ($this->isNewRecord) {

        	$this->valorextenso = $this->extenso($this->valor, true);

    	}

    	return parent::beforeSave();

	}


	function extenso($valor=0, $maiusculas=false) {

    	// verifica se tem virgula decimal

    	if (strpos($valor, ",") > 0) {

        	// retira o ponto de milhar, se tiver

        	$valor = str_replace(".", "", $valor);


        	// troca a virgula decimal por ponto decimal

        	$valor = str_replace(",", ".", $valor);

    	}

    	$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);

    	$cont = count($inteiro);

    	for ($i = 0; $i < $cont; $i++)

        	for ($ii = strlen($inteiro[$i]); $ii < 3; $ii++)

            	$inteiro[$i] = "0" . $inteiro[$i];


    	$fim = $cont - ($inteiro[$cont - 1] > 0 ? 1 : 2);

    	$rt = '';

    	for ($i = 0; $i < $cont; $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 = $cont - 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");

    	} elseif ($maiusculas == "2") {

        	return (strtoupper($rt) ? strtoupper($rt) : "Zero");

    	} else {

        	return (ucwords($rt) ? ucwords($rt) : "Zero");

    	}

	}



Flw :D:slight_smile:::);)

Amigos dá sim pra mostrar na view sem precisar jogar no BD

Assim:




	<?php

	$this->widget('zii.widgets.CDetailView', array(

    	'data' => $model,

    	'attributes' => array(

        	array(

            	'name' => 'valor',

            	'value' => $model->extenso($model->valor, true),

        	),

    	),

    	'nullDisplay' => '<span class="null"></span>',

	));

	?>



As vezes as coisas estão na nossa frente mais não conseguirmos enchergar… Foi mal…:( :)

Obrigado Adrian!

Este exemplo será sempre útil.

Está função ele monta corretamente o valor por extenso ou fica algumas palavras invertida do singular para o plural ou vice-versa?

Newerton,

Peguei esta função na Web, não me lembro qual o site, mas os testes que fiz aqui ela monta certinho.

:rolleyes:

Testei aqui hoje, e funciono normal!

É amigo todos os teste que fiz aqui também funcionou que uma beleza

:rolleyes: