Fala pessoal!
Tenho um código simples pro BU(BrazilUtils) que tá dando uma pequena dor de cabeça…
Tenho uma classe básica de Unidades:
[code]
import java.math.*;
public class Unit {
String name;
BigDecimal valueOnBaseUnit;
public Unit(String name, BigDecimal valueOnBaseUnit) {
this.name = name;
this.valueOnBaseUnit = valueOnBaseUnit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getValueOnBaseUnit() {
return valueOnBaseUnit;
}
public void setValueOnBaseUnit(BigDecimal valueOnBaseUnit) {
this.valueOnBaseUnit = valueOnBaseUnit;
}
@Override
public String toString() {
return "[name=" + name + ",value=" + valueOnBaseUnit + "]";
}
}[/code]
2 interfaces, sendo uma com o método UnitWithValue convertTo(Unit unit); e a outra com as constantes que eu quero:
public interface AreaMetrics {
//A base é Metros Quadrados /*Square Metric is the unit base */
Unit M2 = new Unit("m²", new BigDecimal(String.valueOf(1)));
Unit ACRE=new Unit( "acre",new BigDecimal(4046.8564224 ));
Unit ARES=new Unit("ares",new BigDecimal(String.valueOf(100)));
//blablabla
Unit QUILOMETRO_QUADRADO=new Unit("quilometro_quadrado" ,new BigDecimal(String.valueOf(1000000)));
Unit BASE=M2;
}
E a classe principal de Área:
[code]
import java.math.BigDecimal;
//import org.brazilutils.metrics.*;
public class Area implements UnitWithValue,AreaMetrics {
private static final long serialVersionUID = 210046788217078583L;
private Unit unit;
private BigDecimal value;
private BigDecimal base;
public Area(BigDecimal value,Unit unit,int roudingMode,int scale){
this.base = value.multiply(unit.getValueOnBaseUnit());//,roudingMode,scale);
this.value = value;
this.unit = unit;
}
public Area(BigDecimal value,Unit unit){
this.base = value.multiply(unit.getValueOnBaseUnit());
this.value = value;
this.unit = unit;
}
public String toString() {
return "[valor= " + value + ",unidade= " + unit + ",valorNaBase= " + base + "]";
}
/*public UnitWithValue convertTo(Unit unit,int scale,int roundingmode) {
return new Area(base.divide(unit.getValueOnBaseUnit(),scale,roundingmode),unit);
}**/
public UnitWithValue convertTo(Unit unit){
return new Area(base.divide(unit.getValueOnBaseUnit()),unit);
}
public Unit getUnit(){
return unit;
}
public void setUnit(Unit u) {
this.unit = u;
this.value = base.divide(unit.getValueOnBaseUnit());//, int round);
}
public static void main(String[] args) {
Area area1 = new Area(new BigDecimal(10000), Area.M2);
System.out.println(area1);
System.out.println(area1.convertTo(Area.HECTARE));
System.out.println(area1.convertTo(Area.ACRE));
}
}[/code]
Meu problema:
Eu não consigo dividir corretamente(recebo uma AritmeticException) porque eu não consigo precisar o resultado de forma decimal.Não posso usar MathContext(Aí seria mole…) porquê o código TEM que ser compatível com o Java 1.4.Alguém tem uma idéia de como eu poderia evitar isso(de preferência de forma elegante…)