Formatar valores (moeda) antes de salvar

1,567 views
Skip to first unread message

Leandro

unread,
Feb 12, 2009, 11:26:26 AM2/12/09
to CakePHP Tuga
Olá pessoal,

Estou desenvolvendo uma aplicação onde a pessoa que for utilizar vai
precisar digitar os valores no formato brasileiro (Ex.: 3.281,32 ou
3281,32).

Para exibir os valores na view está tranquilo com o helper number,
porém não sei como posso fazer antes de salvar pois se digito o número
com virgula no separador de decimais ele salva no banco sem os
centavos, tipo digito 3281,32 ele salva 3281.00.

Procurei e não encontrei nada, se alguém tiver alguma coisa pronta e
puder compartilhar agradeço. Por mim poderia ser assim mesmo, o f*!@ é
acostumar o usuário a usar isso, não acho legal.


Att
Leandro

Daniel Pakuschewski

unread,
Feb 12, 2009, 11:29:16 AM2/12/09
to cakep...@googlegroups.com
Leandro qual o tipo do campo no Banco de Dados?

2009/2/12 Leandro <leandro....@gmail.com>



--
Daniel Luiz Pakuschewski
Desenvolvedor Web
(w) www.danielpk.com.br
(c) 41 8837 6672

Leandro Brambilla

unread,
Feb 12, 2009, 11:32:18 AM2/12/09
to cakep...@googlegroups.com
No banco (Mysql) criei como double(10,2).


2009/2/12 Daniel Pakuschewski <sphi...@gmail.com>

Daniel Pakuschewski

unread,
Feb 12, 2009, 11:39:11 AM2/12/09
to cakep...@googlegroups.com
Leandro eu uso no meu aqui DECIMAL(10,2) e consigo mandar pro banco sem problemas os dados.

Estou usando junto a mascara em Jquery que formata em Reais(1.000,00) e está salvando os dados sem problemas.

Agora não sei se estou usando o tipo de campo correto. ;P

Leandro Brambilla

unread,
Feb 12, 2009, 11:49:36 AM2/12/09
to cakep...@googlegroups.com
Alterei o meu campo valor aqui pra DECIMAL(10,2) e não deu, é uma zica mesmo...


2009/2/12 Daniel Pakuschewski <sphi...@gmail.com>

Daniel Pakuschewski

unread,
Feb 12, 2009, 12:30:21 PM2/12/09
to cakep...@googlegroups.com
Leandro, estranho, uso aqui sem problemas.

2009/2/12 Leandro Brambilla <leandro....@gmail.com>

Juan Basso

unread,
Feb 12, 2009, 3:33:28 PM2/12/09
to CakePHP Tuga
Leandro,

O banco normalmente quer que você passe no formato inglês (, para
separador de milhar e . para separador decimal). No seu caso, ele
ignora a sua vírgula do número... Põe num beforeSave para mudar de ,
para . (lembre-se de tirar todos os pontos antes).


Juan Basso

On 12 fev, 15:30, Daniel Pakuschewski <sphin...@gmail.com> wrote:
> Leandro, estranho, uso aqui sem problemas.
>
> 2009/2/12 Leandro Brambilla <leandro.brambi...@gmail.com>
>
>
>
> > Alterei o meu campo valor aqui pra DECIMAL(10,2) e não deu, é uma zica
> > mesmo...
>
> > 2009/2/12 Daniel Pakuschewski <sphin...@gmail.com>

Leandro Brambilla

unread,
Feb 13, 2009, 6:35:52 AM2/13/09
to cakep...@googlegroups.com
Juan,

Foi exatamente o que pensei em fazer, apenas queria ter certeza que o Cake não tinha algum tipo de tratamento para isso já por isso postei a dúvida aqui.

Obrigado.

Leandro

2009/2/12 Juan Basso <jrb...@gmail.com>

Daniel Pakuschewski

unread,
Feb 13, 2009, 6:38:03 AM2/13/09
to cakep...@googlegroups.com
Agora que lembrei eu tinha feito isso antes tambem :D


--
Daniel Luiz Pakuschewski
Desenvolvedor Web

Leandro Brambilla

unread,
Feb 13, 2009, 6:42:20 AM2/13/09
to cakep...@googlegroups.com
Hehehe, tem a função pronta aí já?

2009/2/13 Daniel Pakuschewski <sphi...@gmail.com>

Daniel Pakuschewski

unread,
Feb 13, 2009, 6:49:53 AM2/13/09
to cakep...@googlegroups.com
str_replace? :P

$variavel = str_replace('.', '', $variavel)
$variavel = str_replace(',', '.', $variavel);
 



2009/2/13 Leandro Brambilla <leandro....@gmail.com>

Leandro Brambilla

unread,
Feb 13, 2009, 2:15:22 PM2/13/09
to cakep...@googlegroups.com
Do modo mais rápido seria isso mesmo :)

Tentei fazer uma coisa "mais melhor" porque nunca se sabe o formato que o cara vai digitar, dai ficou assim

<?php
    function formataMoedaBeforeSave($valor) {
        if ( (substr($valor, -3, 1) == ',') || (substr($valor, -3, 1) == '.') ) {
            $centavos = substr($valor, -2);
            $milhar = substr($valor, 0, (strlen($valor) - 3));
        } elseif ( (substr($valor, -2, 1) == ',') || (substr($valor, -2, 1) == '.') ) {
            $centavos = substr($valor, -1).'0';
            $milhar = substr($valor, 0, (strlen($valor) - 2));
        } elseif ( (substr($valor, -1) == ',') || (substr($valor, -1) == '.') ) {
            $centavos = '00';
            $milhar = substr($valor, 0, (strlen($valor) - 1));
        } else {
            $centavos = '00';
            $milhar = $valor;
        }
        $milhar = str_replace('.','',$milhar);
        $milhar = str_replace(',','',$milhar);
        $valor = $milhar.'.'.$centavos;
       
        return $valor;
    }
?>

Nesse caso o cara pode digitar o valor usando vírgula ou ponto como separador decimal 1,2 ou nenhuma casa após o separador.
Ex:
1234
1234.
1234,
1234.5
1234,5
1234.56
1234,56

E por aí vai, os separadores de milhar são desconsiderados. Alguma sugestão quanto a otimização de código, bugs e outros são bem vindas.

Obrigado pessoal.

Leandro Brambilla


2009/2/13 Daniel Pakuschewski <sphi...@gmail.com>

Daniel Pakuschewski

unread,
Feb 13, 2009, 5:37:57 PM2/13/09
to cakep...@googlegroups.com
O meu eu tenho uma mascara Javascript pro cara digitar, e como é na administração apenas acho dificil o meu cliente ter o JS desabilitado.

Mas fica ai a dica ;)

2009/2/13 Leandro Brambilla <leandro....@gmail.com>

Marcelo Andrade

unread,
Feb 14, 2009, 12:04:10 AM2/14/09
to cakep...@googlegroups.com
2009/2/12 Juan Basso <jrb...@gmail.com>:
>
> (..) Põe num beforeSave para mudar de ,

> para . (lembre-se de tirar todos os pontos antes).

Bem, tem um behaviour -- mas, no caso, para datas[1] -- cuja
idéia é deixar transparente a conversão do formato legível
por humanos e o formato adequado para o banco agindo no
afterFind e beforeSave. Mas certamente é bem simples adaptar
para o caso de números decimais.

Atenciosamente.

[1] http://nik.chankov.net/2007/12/20/using-different-date-format-in-cakephp-12

--
MARCELO DE F. ANDRADE (aka "eleKtron")
Belem, PA, Amazonia, Brazil
Linux User #221105

[gus@pará ~]# links http://pa.slackwarebrasil.org/

Reply all
Reply to author
Forward
0 new messages