package de.invesdwin.util.math.decimal.scaled;
import java.text.DecimalFormatSymbols;
import javax.annotation.concurrent.Immutable;
import de.invesdwin.util.lang.Strings;
import de.invesdwin.util.math.decimal.Decimal;
@Immutable
public enum PercentScale implements IDecimalScale<Percent, PercentScale> {
RATE("Rate", 0, ""),
PERCENT("Percent", 2, String.valueOf(DecimalFormatSymbols.getInstance().getPercent())),
PERMILLE("Permille", 3, String.valueOf(DecimalFormatSymbols.getInstance().getPerMill()));
private final String text;
private final int scale;
private String symbol;
PercentScale(final String text, final int scale, final String symbol) {
this.text = text;
this.scale = scale;
this.symbol = symbol;
}
public int getScale() {
return scale;
}
@Override
public String toString() {
return text;
}
@Override
public Decimal convertValue(final Percent parent, final Decimal value, final PercentScale scale) {
final Decimal rateValue = value.scaleByPowerOfTen(-scale.getScale());
return rateValue.scaleByPowerOfTen(getScale());
}
@Override
public int getDefaultDecimalDigits(final Percent parent) {
return PercentScale.PERMILLE.getScale() - getScale() + 1;
}
@Override
public String getFormat(final Percent parent, final boolean withSymbol, final int decimalDigits,
final boolean decimalDigitsOptional) {
String format = ",##0";
if (decimalDigits > 0) {
final String decimalDigitsStr;
if (decimalDigitsOptional) {
decimalDigitsStr = "#";
} else {
decimalDigitsStr = "0";
}
format += "." + Strings.repeat(decimalDigitsStr, decimalDigits);
}
if (withSymbol && symbol.length() > 0) {
format += "'" + symbol + "'";
}
return format;
}
@Override
public String getSymbol() {
return symbol;
}
}