/*
* Copyright (C) Justo Montiel, David Torres, Sergio Gomez, Alberto Fernandez
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <http://www.gnu.org/licenses/>
*/
package utils;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
* <p>
* <b>MultiDendrograms</b>
* </p>
*
* Simplified interface to BigDecimal
*
* @author Justo Montiel, David Torres, Sergio Gómez, Alberto Fernández
*
* @since JDK 6.0
*/
public class PrecDouble {
private BigDecimal bd = new BigDecimal("0.0");
public PrecDouble(final String num) {
this.inicialitzaValor(num);
}
public PrecDouble(final Double num) {
this.inicialitzaValor(num.toString());
}
public PrecDouble(final Float num) {
this.inicialitzaValor(num.toString());
}
public PrecDouble(final Integer num) {
this.inicialitzaValor(num.toString());
}
public PrecDouble(final BigDecimal num) {
bd = num;
}
private void inicialitzaValor(final String num) {
try {
bd = new BigDecimal(num);
} catch (final Exception e) {
System.out.println(e.getMessage());
e.getStackTrace();
bd = new BigDecimal("0.0");
}
}
public void Suma(final BigDecimal num) {
bd = bd.add(num);
}
public void Suma(final PrecDouble num) {
this.Suma(num.parserToBigDecimal());
}
public void Suma(final int num) {
this.Suma(new BigDecimal(Integer.toString(num)));
}
public void Suma(final double num) {
this.Suma(new BigDecimal(Double.toString(num)));
}
public void Suma(final String num) {
this.Suma(new BigDecimal(num));
}
public void Resta(final BigDecimal num) {
bd = bd.subtract(num);
}
public void Resta(final PrecDouble num) {
this.Resta(num.parserToBigDecimal());
}
public void Resta(final int num) {
this.Resta(new BigDecimal(Integer.toString(num)));
}
public void Resta(final double num) {
this.Resta(new BigDecimal(Double.toString(num)));
}
public void Resta(final String num) {
this.Resta(new BigDecimal(num));
}
public void Producto(final BigDecimal num) {
bd = bd.multiply(num);
}
public void Producto(final PrecDouble num) {
this.Producto(num.parserToBigDecimal());
}
public void Producto(final int num) {
this.Producto(new BigDecimal(Integer.toString(num)));
}
public void Producto(final double num) {
this.Producto(new BigDecimal(Double.toString(num)));
}
public void Producto(final String num) {
this.Producto(new BigDecimal(num));
}
public void Division(final BigDecimal num) {
bd = bd.divide(num, new MathContext(100));
}
public void Division(final PrecDouble num) {
this.Division(num.parserToBigDecimal());
}
public void Division(final int num) {
this.Division(new BigDecimal(Integer.toString(num)));
}
public void Division(final double num) {
this.Division(new BigDecimal(Double.toString(num)));
}
public void Division(final String num) {
this.Division(new BigDecimal(num));
}
public void Pow(final int pot) {
bd = bd.pow(pot);
}
public void Plus() {
bd = bd.plus();
}
public void CanviSigne() {
bd = bd.negate();
}
public void SetPositiu() {
bd = bd.abs();
}
public void SetMajor(final BigDecimal num) {
if (num.compareTo(bd) > 0) {
bd = num;
}
}
public void SetMajor(final PrecDouble num) {
this.SetMajor(num.parserToBigDecimal());
}
public void SetMajor(final double num) {
this.SetMajor(new BigDecimal(Double.toString(num)));
}
public void SetMajor(final int num) {
this.SetMajor(new BigDecimal(Integer.toString(num)));
}
public void SetMajor(final String num) {
this.SetMajor(new BigDecimal(num));
}
public void SetMenor(final BigDecimal num) {
if (num.compareTo(bd) < 0) {
bd = num;
}
}
public void SetMenor(final PrecDouble num) {
this.SetMenor(num.parserToBigDecimal());
}
public void SetMenor(final double num) {
this.SetMenor(new BigDecimal(Double.toString(num)));
}
public void SetMenor(final int num) {
this.SetMenor(new BigDecimal(Integer.toString(num)));
}
public void SetMenor(final String num) {
this.SetMenor(new BigDecimal(num));
}
public boolean equals(final BigDecimal num) {
return bd.compareTo(num) == 0;
}
public boolean equals(final PrecDouble num) {
return this.equals(num.parserToBigDecimal());
}
public boolean equals(final int num) {
return this.equals(new BigDecimal(Integer.toString(num)));
}
public boolean equals(final double num) {
return this.equals(new BigDecimal(Double.toString(num)));
}
public boolean equals(final String num) {
return this.equals(new BigDecimal(num));
}
public int CompareTo(final BigDecimal num) {
return bd.compareTo(num);
}
public int CompareTo(final PrecDouble num) {
return this.CompareTo(num.parserToBigDecimal());
}
public int CompareTo(final int num) {
return this.CompareTo(new BigDecimal(Integer.toString(num)));
}
public int CompareTo(final double num) {
return this.CompareTo(new BigDecimal(Double.toString(num)));
}
public int CompareTo(final String num) {
return this.CompareTo(new BigDecimal(num));
}
public boolean isMenor(final BigDecimal num) {
return (bd.compareTo(num) < 0);
}
public boolean isMenor(final PrecDouble num) {
return this.isMenor(num.parserToBigDecimal());
}
public boolean isMenor(final int num) {
return this.isMenor(new BigDecimal(Integer.toString(num)));
}
public boolean isMenor(final double num) {
return this.isMenor(new BigDecimal(Double.toString(num)));
}
public boolean isMenor(final String num) {
return this.isMenor(new BigDecimal(num));
}
public boolean isMajor(final BigDecimal num) {
return (bd.compareTo(num) > 0);
}
public boolean isMajor(final PrecDouble num) {
return this.isMajor(num.parserToBigDecimal());
}
public boolean isMajor(final int num) {
return this.isMajor(new BigDecimal(Integer.toString(num)));
}
public boolean isMajor(final double num) {
return this.isMajor(new BigDecimal(Double.toString(num)));
}
public boolean isMajor(final String num) {
return this.isMenor(new BigDecimal(num));
}
public double parserToDouble() {
return bd.doubleValue();
}
public int parserToInteger() {
return bd.intValueExact();
}
public BigDecimal parserToBigDecimal() {
return bd;
}
public void setPrecisio(final int prec) {
bd = bd.setScale(prec, BigDecimal.ROUND_HALF_UP);
}
public void setPrecisio(final int prec, final RoundingMode round) {
bd = bd.setScale(prec, round);
}
public int getPrecisio() {
return bd.scale();
}
@Override
public String toString() { // Puede usar notacion cientifica plain no
return bd.toString();
}
public String toPlainString() {
return bd.toPlainString(); // no usa notacion cientifica
}
public String toString(final String patron) {
String cad;
final DecimalFormat formato = new DecimalFormat(patron);
try {
cad = formato.format(bd);
} catch (final Exception e) {
cad = bd.toString();
}
return cad;
}
@Override
public PrecDouble clone() {
final PrecDouble pd_clon = new PrecDouble(bd);
return pd_clon;
}
}