Tipo Money

Não deixe de perguntar, solucione aqui suas dúvidas...

Tipo Money

Mensagempor jtakata » Seg Mai 09, 2011 11:19 pm

Olá Rógel e demais membros.

O método setPrecision da classe Money permite que eu altere a quantidade de casas decimais de uma variável?
Posso utilizar outros métodos (multiplicação, divisão etc) em campos com precisões diferentes e ele se vira pra ajustar?
Eu pensei em usar em conversão de moedas, calculo de porcentagem etc.
Por exemplo, taxa de câmbio = 1,6885, valor em US$ = 1.350,00 daria 2.279,4750. Suponho que se colocar o resultado em outro campo Money com arredondamento ROUND_HALF_UP daria R$2.279,48.
Estou certo?

Grato e abraços,
Jorge
jtakata
 
Mensagens: 350
Data de registro: Seg Abr 26, 2010 11:04 pm

Re: Tipo Money

Mensagempor rogelgarcia » Qui Mai 12, 2011 1:18 pm

No seu teste, qual foi o valor retornado?
rogelgarcia
Administrador
 
Mensagens: 674
Data de registro: Qua Jul 08, 2009 9:02 am

Re: Tipo Money

Mensagempor jtakata » Qui Mai 12, 2011 4:56 pm

Na verdade eu não havia testado nada.
Fiz alguns testes agora:
Money valor = new Money(1350.00);
Money valor1 = new Money(0);
Money taxa =new Money(1.6885);
valor1 = valor.multiply(taxa);
O resultado foi 2.279,48, ou seja, está correto.
Ainda não fiz testes de persistência do tipo Money mas lembro que você disse que ele deve ser mapeado como BigInt.
jtakata
 
Mensagens: 350
Data de registro: Seg Abr 26, 2010 11:04 pm

Re: Tipo Money

Mensagempor rogelgarcia » Qui Mai 12, 2011 5:51 pm

Exatamente.

Essa classe Money, na verdade foi um colega meu que fez e ele se baseou num artigo para escrevê-la.
Talvez possam existir alguns detalhes da classe Money que não te atendam por você ter alguns requisitos especiais. Talvez precise de mais funcionalidades.

Se for o caso, a minha sugestão é que copie o código da classe Money para uma classe sua, e modifique da maneira que achar necessário. Lembrando que isso só será necessário no caso de a classe Money não te atender.

Até mais
rogelgarcia
Administrador
 
Mensagens: 674
Data de registro: Qua Jul 08, 2009 9:02 am

Re: Tipo Money

Mensagempor jtakata » Qui Mai 12, 2011 6:25 pm

Pois é...
Acabei de fazer um teste de persistência, conforme trecho abaixo (já mexi e remexi o campo taxaDeCambio e o resultado não mudou):
--------------------------------------
public class Valores{
private Long id;
private Money valorBase = new Money(0);
private Money taxaDeCambio = new Money(0);
private Money resultado = new Money(0);
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="sq_valores")
public Long getId(){
return this.id;
}
public Money getValorBase(){
return this.valorBase;
}
public Money getTaxaDeCambio(){
this.taxaDeCambio.setPrecision(10000);
return this.taxaDeCambio;
}
@Transient
public Money getResultado(){
return this.resultado=this.valorBase.multiply(this.taxaDeCambio);
}
}
--------------------------------------
O que era Money foi criado na tabela como BigInt (criado automaticamente).
O problema é que eu queria a taxa com 4 casas decimais mas na tela fica fixo com duas.
Se isso não tiver solução, vou ver o que fazer.

Abraços,
Jorge
jtakata
 
Mensagens: 350
Data de registro: Seg Abr 26, 2010 11:04 pm

Re: Tipo Money

Mensagempor jtakata » Qui Mai 12, 2011 9:46 pm

Eu dei uma olhada na classe Money.
Eu vi que tem valor fixo 2 no "setScale" nos métodos "round()" e "toLong()".
Se criar uma variável "scale" com default 2 e outros métodos "round(int scale)" e "toLong(int scale)" e mexer no método "toString()" para formatar de acordo com o scale e mais um método "setScale(int scale)", acho que deve atender o que eu preciso.
Ou seja, se eu quiser um Money com 4 casas decimais, bastaria eu chamar o método setScale(4), assim, a partir daí se estaria trabalhando com 4 casas decimais para uma determinada variável.
Talvez tenha de mexer em mais alguma coisa (por exemplo, nas operações aritméticas) mas isso eu não consegui enxergar.
O meu raciocínio está correto?
jtakata
 
Mensagens: 350
Data de registro: Seg Abr 26, 2010 11:04 pm

Re: Tipo Money

Mensagempor rogelgarcia » Seg Mai 16, 2011 11:57 pm

Está correto.. Quando mencionei que alguma alteração pudesse ser necessária, me referia a justamente o scale.

Faça testes para verificar se os cálculos estão de acordo. Mas é esse o caminho mesmo.
rogelgarcia
Administrador
 
Mensagens: 674
Data de registro: Qua Jul 08, 2009 9:02 am

Re: Tipo Money

Mensagempor rogelgarcia » Ter Mai 17, 2011 12:00 am

Um outro detalhe...

Ao salvar a classe no banco de dados.. é assumido que existem duas casas decimais.

Pode ser interessante que você trabalhe apenas com 4 casas sempre.. ao salvar e ler do banco de dados..

Existem algumas multiplicacoes ou divisoes por 100 no código. Isso tem que ser atualizado para 10000, caso deseje usar 4 casas decimais.

Como pode-se perder o controle de quantas casas decimais devem ser utilizadas foi fixado na classe, o uso de 2 casas.

Pode ser interessante manter o número de casas decimais fixo. No seu caso, pode fixar em 4 (e atualizar as multiplicacoes e divisoes)

Quando desejar mostrar o valor com apenas duas casas, pode fazer um método que retorne o valor com 2 casas apenas para visualizacao...
rogelgarcia
Administrador
 
Mensagens: 674
Data de registro: Qua Jul 08, 2009 9:02 am

Re: Tipo Money

Mensagempor rogelgarcia » Ter Mai 17, 2011 12:03 am

Note que a classe Money serve para facilitar o trabalho com valores monetários. No entanto, ela foi feita de forma simples. Para aplicações do dia a dia, ela é suficiente. Para aplicações financeiras, podem ser necessários outros algoritmos.
rogelgarcia
Administrador
 
Mensagens: 674
Data de registro: Qua Jul 08, 2009 9:02 am

Re: Tipo Money

Mensagempor jtakata » Ter Mai 17, 2011 4:59 pm

Acho que vou precisar de algo mais flexível.
Vou pesquisar a classe BigDecimal pra ver se me atende.
Outra coisa que percebi é que a classe Money está "integrada" ao Next.
Concluí isso pelo fato de o Money ser renderizado na tela com duas casas decimais. Estou certo?
Então, se eu criar uma nova classe, onde devo mexer para que esta também seja "integrada" ao Next?
jtakata
 
Mensagens: 350
Data de registro: Seg Abr 26, 2010 11:04 pm

Próximo

Retornar para Dúvidas

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes