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