blob: 8332e24c3ba6d04408784e784543ee2929e2c238 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2008, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.impl.icuadapter;
import java.math.RoundingMode;
import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import com.ibm.icu.impl.jdkadapter.NumberFormatICU;
import com.ibm.icu.math.BigDecimal;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.CurrencyAmount;
/**
* NumberFormatJDK is an adapter class which wraps java.text.NumberFormat and
* implements ICU4J NumberFormat APIs.
*/
public class NumberFormatJDK extends com.ibm.icu.text.NumberFormat {
private static final long serialVersionUID = -1739846528146803964L;
private NumberFormat fJdkNfmt;
private NumberFormatJDK(NumberFormat jdkNfmt) {
fJdkNfmt = jdkNfmt;
}
public static com.ibm.icu.text.NumberFormat wrap(NumberFormat jdkNfmt) {
if (jdkNfmt instanceof NumberFormatICU) {
return ((NumberFormatICU)jdkNfmt).unwrap();
}
return new NumberFormatJDK(jdkNfmt);
}
public NumberFormat unwrap() {
return fJdkNfmt;
}
@Override
public Object clone() {
NumberFormatJDK other = (NumberFormatJDK)super.clone();
other.fJdkNfmt = (NumberFormat)fJdkNfmt.clone();
return other;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof NumberFormatJDK) {
return ((NumberFormatJDK)obj).fJdkNfmt.equals(fJdkNfmt);
}
return false;
}
//public String format(java.math.BigDecimal number)
//public String format(BigDecimal number)
@Override
public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number, toAppendTo, pos);
}
@Override
public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number.toBigDecimal(), toAppendTo, pos);
}
@Override
public StringBuffer format(java.math.BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number, toAppendTo, pos);
}
//public String format(java.math.BigInteger number)
//String format(CurrencyAmount currAmt)
@Override
public StringBuffer format(CurrencyAmount currAmt, StringBuffer toAppendTo, FieldPosition pos) {
java.util.Currency save = fJdkNfmt.getCurrency();
String currCode = currAmt.getCurrency().getCurrencyCode();
boolean same = save.getCurrencyCode().equals(currCode);
if (!same) {
fJdkNfmt.setCurrency(java.util.Currency.getInstance(currCode));
}
fJdkNfmt.format(currAmt.getNumber(), toAppendTo, pos);
if (!same) {
fJdkNfmt.setCurrency(save);
}
return toAppendTo;
}
//public String format(double number)
@Override
public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number, toAppendTo, pos);
}
//public String format(long number)
@Override
public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number, toAppendTo, pos);
}
@Override
public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) {
return fJdkNfmt.format(number, toAppendTo, pos);
}
@Override
public Currency getCurrency() {
java.util.Currency jdkCurrency = fJdkNfmt.getCurrency();
if (jdkCurrency == null) {
return null;
}
return Currency.getInstance(jdkCurrency.getCurrencyCode());
}
//protected Currency getEffectiveCurrency()
@Override
public int getMaximumFractionDigits() {
return fJdkNfmt.getMaximumFractionDigits();
}
@Override
public int getMaximumIntegerDigits() {
return fJdkNfmt.getMaximumIntegerDigits();
}
@Override
public int getMinimumFractionDigits() {
return fJdkNfmt.getMinimumFractionDigits();
}
public int getMinumumIntegerDigits() {
return fJdkNfmt.getMinimumIntegerDigits();
}
@Override
public int getRoundingMode() {
RoundingMode jdkMode = fJdkNfmt.getRoundingMode();
int icuMode = BigDecimal.ROUND_UP;
if (jdkMode.equals(RoundingMode.CEILING)) {
icuMode = BigDecimal.ROUND_CEILING;
} else if (jdkMode.equals(RoundingMode.DOWN)) {
icuMode = BigDecimal.ROUND_DOWN;
} else if (jdkMode.equals(RoundingMode.FLOOR)) {
icuMode = BigDecimal.ROUND_FLOOR;
} else if (jdkMode.equals(RoundingMode.HALF_DOWN)) {
icuMode = BigDecimal.ROUND_HALF_DOWN;
} else if (jdkMode.equals(RoundingMode.HALF_EVEN)) {
icuMode = BigDecimal.ROUND_HALF_EVEN;
} else if (jdkMode.equals(RoundingMode.HALF_UP)) {
icuMode = BigDecimal.ROUND_HALF_UP;
} else if (jdkMode.equals(RoundingMode.UNNECESSARY)) {
icuMode = BigDecimal.ROUND_UNNECESSARY;
} else if (jdkMode.equals(RoundingMode.UP)) {
icuMode = BigDecimal.ROUND_UP;
}
return icuMode;
}
@Override
public int hashCode() {
return fJdkNfmt.hashCode();
}
@Override
public boolean isGroupingUsed() {
return fJdkNfmt.isGroupingUsed();
}
@Override
public boolean isParseIntegerOnly() {
return fJdkNfmt.isParseIntegerOnly();
}
@Override
public boolean isParseStrict() {
// JDK NumberFormat does not support strict parsing
return false;
}
@Override
public Number parse(String text) throws ParseException {
return fJdkNfmt.parse(text);
}
@Override
public Number parse(String text, ParsePosition parsePosition) {
return fJdkNfmt.parse(text, parsePosition);
}
//public Object parseObject(String source, ParsePosition parsePosition)
@Override
public void setCurrency(Currency theCurrency) {
if (theCurrency == null) {
fJdkNfmt.setCurrency(null);
return;
} else {
fJdkNfmt.setCurrency(java.util.Currency.getInstance(theCurrency.getCurrencyCode()));
}
}
@Override
public void setGroupingUsed(boolean newValue) {
fJdkNfmt.setGroupingUsed(newValue);
}
@Override
public void setMaximumFractionDigits(int newValue) {
fJdkNfmt.setMaximumFractionDigits(newValue);
}
@Override
public void setMaximumIntegerDigits(int newValue) {
fJdkNfmt.setMaximumIntegerDigits(newValue);
}
@Override
public void setMinimumFractionDigits(int newValue) {
fJdkNfmt.setMinimumFractionDigits(newValue);
}
@Override
public void setMinimumIntegerDigits(int newValue) {
fJdkNfmt.setMinimumIntegerDigits(newValue);
}
@Override
public void setParseIntegerOnly(boolean value) {
fJdkNfmt.setParseIntegerOnly(value);
}
@Override
public void setParseStrict(boolean value) {
// JDK NumberFormat does not support strict parsing - ignore this operation
}
@Override
public void setRoundingMode(int roundingMode) {
RoundingMode mode = null;
switch (roundingMode) {
case BigDecimal.ROUND_CEILING:
mode = RoundingMode.CEILING;
break;
case BigDecimal.ROUND_DOWN:
mode = RoundingMode.DOWN;
break;
case BigDecimal.ROUND_FLOOR:
mode = RoundingMode.FLOOR;
break;
case BigDecimal.ROUND_HALF_DOWN:
mode = RoundingMode.HALF_DOWN;
break;
case BigDecimal.ROUND_HALF_EVEN:
mode = RoundingMode.HALF_EVEN;
break;
case BigDecimal.ROUND_HALF_UP:
mode = RoundingMode.HALF_UP;
break;
case BigDecimal.ROUND_UNNECESSARY:
mode = RoundingMode.UNNECESSARY;
break;
case BigDecimal.ROUND_UP:
mode = RoundingMode.UP;
break;
}
if (mode == null) {
throw new IllegalArgumentException("Invalid rounding mode: " + roundingMode);
}
fJdkNfmt.setRoundingMode(mode);
}
}