Padrão Money

5 respostas
S
Boa Noite! Estou implementando o padrão Money, ta funcionando e tudo, mas, sempre tem um, porém, fiquei com algumas duvidas, vou postar o código e logo abaixo as dúvidas. Classe Money retirei alguns métodos para focar nas dúvidas.
@Embeddable
public final class Dinheiro {
	
	private static final long FATOR_FRACIONARIO = 100;
	private static final String SEPARADOR_DECIMAL = ",";

	private Currency moeda = Currency.getInstance(new Locale("pt", "BR"));
	
	@Access(AccessType.FIELD)
	private long valor;
	
	private Dinheiro(long valor, Currency moeda) {
		this.valor = valor;
		this.moeda = moeda;
	}

	public static Dinheiro valueOf(String valor, Currency moeda) {
		return valueOf(new BigDecimal(valor), moeda);
	}

	private static Dinheiro valueOf(BigDecimal valor, Currency moeda) {
		//codigo...
	}
	
	@Transient
	public Currency getMoeda() {
		return moeda;
	}
	
	public long getValor() {
		return valor;
	}
	
	@Transient
	public String getValorFormatado() {
		DecimalFormat dfUnidade = new DecimalFormat("00");
		DecimalFormat dfDecimal = new DecimalFormat("#.###");		
		return dfDecimal.format(this.valor / FATOR_FRACIONARIO) + SEPARADOR_DECIMAL 
				+ dfUnidade.format(this.valor % FATOR_FRACIONARIO);
	}
	
}
Uma classe utilizando:
@Entity
public class Estoque implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Long id;
	
	private Dinheiro precoUnitario;
	private Dinheiro precoMedio;
	
	private Produto produto;
	
	public Estoque() {
		
	}

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}

	@OneToOne
	@JoinColumn(name = "fk_produto")
	@ForeignKey(name = "produto_fk")
	public Produto getProduto() {
		return produto;
	}
	
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	
	@Embedded
	@AttributeOverrides( {
        @AttributeOverride(name="valor", column = @Column(name="preco_unitario") )
	} )
	public Dinheiro getPrecoUnitario() {
		return precoUnitario;
	}

	public void setPrecoUnitario(Dinheiro precoUnitario) {
		this.precoUnitario = precoUnitario;
	}

	@Embedded
	@AttributeOverrides( {
        @AttributeOverride(name="valor", column = @Column(name="preco_medio") )
	} )
	public Dinheiro getPrecoMedio() {
		return precoMedio;
	}

	public void setPreco(Dinheiro precoMedio) {
		this.precoMedio = precoMedio;
	}
	
}
fica a dica ai para quem precisar de mais de um @Embedded numa classe. Agora as dúvidas: quando persisti o codigo abaixo:
Estoque estoque = new Estoque();
		Dinheiro d1 = Dinheiro.valueOf("25", moeda);
		Dinheiro d2 = Dinheiro.valueOf("1", moeda);
		d2 = d2.somar(Dinheiro.valueOf("075", moeda));
		estoque.setPrecoUnitario(d1);
		estoque.setPrecoMedio(d2);
no banco, a soma de 1 + 075 resultou em: 760000 a dúvida é como um DBA vai trabalhar com esse valor e como vou somar algo como: 0,34 + 22,99; como o usuario vai digitar esses valores na pagina JSF? Se for preciso posto os metodos de somar, subtrair...

5 Respostas

A

não entendi pq vc está fazendo isso, mas não é só o cara do banco dividir por 100 (o seu FATOR_FRACIONARIO) ?

no JSF vc vai ter que escrever o um Converter para trabalhar com esse seu padrão

S

aechiara o “isso” que vc disse é o padrão money?
vc poderia ser mais especifico?
vou criar o converter…

A

aechiara o “isso” que vc disse é o padrão money?
vc poderia ser mais especifico?
vou criar o converter…

sim, o padrão money, se puder explicar por que está usando essa implementação, seria bacana

S

Todos sabemos que os calculos com valores monetarios em Java usando double, float etc
não sao suficientes, quando se trata de precisão…vou deixar alguns links abaixo, da uma lida:

http://www.guj.com.br/java/263068-jsr-354-money-and-currency-api—nova-especificacao-para-trabalhar-com-valores-monetarios
http://www.guj.com.br/java/139018-valores-monetarios

os padroes estao ai para serem utilizados.
flw

A

Sesshoumaru:
Todos sabemos que os calculos com valores monetarios em Java usando double, float etc
não sao suficientes, quando se trata de precisão…vou deixar alguns links abaixo, da uma lida:

http://www.guj.com.br/java/263068-jsr-354-money-and-currency-api—nova-especificacao-para-trabalhar-com-valores-monetarios
http://www.guj.com.br/java/139018-valores-monetarios

os padroes estao ai para serem utilizados.
flw

eu sempre usei BigDecimal para valor monetário, mas nunca fui atrás de um pattern, mas ok, se te atende

Criado 23 de fevereiro de 2012
Ultima resposta 26 de fev. de 2012
Respostas 5
Participantes 2