/* ******************************************************************************* * 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); } }