/* ******************************************************************************* * Copyright (C) 2008, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.impl.jdkadapter; import java.math.RoundingMode; import java.text.FieldPosition; import java.text.ParseException; import java.text.ParsePosition; import java.util.Currency; import com.ibm.icu.impl.icuadapter.NumberFormatJDK; import com.ibm.icu.text.NumberFormat; /** * NumberFormatICU is an adapter class which wraps ICU4J NumberFormat and * implements java.text.NumberFormat APIs. */ public class NumberFormatICU extends java.text.NumberFormat { private static final long serialVersionUID = 4892903815641574060L; private NumberFormat fIcuNfmt; private NumberFormatICU(NumberFormat icuNfmt) { fIcuNfmt = icuNfmt; } public static java.text.NumberFormat wrap(NumberFormat icuNfmt) { if (icuNfmt instanceof NumberFormatJDK) { return ((NumberFormatJDK)icuNfmt).unwrap(); } return new NumberFormatICU(icuNfmt); } public NumberFormat unwrap() { return fIcuNfmt; } @Override public Object clone() { NumberFormatICU other = (NumberFormatICU)super.clone(); other.fIcuNfmt = (NumberFormat)fIcuNfmt.clone(); return other; } @Override public boolean equals(Object obj) { if (obj instanceof NumberFormatICU) { return ((NumberFormatICU)obj).fIcuNfmt.equals(fIcuNfmt); } return false; } //public String format(double number) @Override public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { return fIcuNfmt.format(number, toAppendTo, pos); } //public String format(long number); @Override public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { return fIcuNfmt.format(number, toAppendTo, pos); } @Override public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) { return fIcuNfmt.format(number, toAppendTo, pos); } @Override public Currency getCurrency() { com.ibm.icu.util.Currency icuCurrency = fIcuNfmt.getCurrency(); if (icuCurrency == null) { return null; } return Currency.getInstance(icuCurrency.getCurrencyCode()); } @Override public int getMaximumFractionDigits() { return fIcuNfmt.getMaximumFractionDigits(); } @Override public int getMaximumIntegerDigits() { return fIcuNfmt.getMaximumIntegerDigits(); } @Override public int getMinimumFractionDigits() { return fIcuNfmt.getMinimumFractionDigits(); } @Override public int getMinimumIntegerDigits() { return fIcuNfmt.getMinimumIntegerDigits(); } @Override public RoundingMode getRoundingMode() { int icuMode = fIcuNfmt.getRoundingMode(); RoundingMode mode = RoundingMode.UP; switch (icuMode) { case com.ibm.icu.math.BigDecimal.ROUND_CEILING: mode = RoundingMode.CEILING; break; case com.ibm.icu.math.BigDecimal.ROUND_DOWN: mode = RoundingMode.DOWN; break; case com.ibm.icu.math.BigDecimal.ROUND_FLOOR: mode = RoundingMode.FLOOR; break; case com.ibm.icu.math.BigDecimal.ROUND_HALF_DOWN: mode = RoundingMode.HALF_DOWN; break; case com.ibm.icu.math.BigDecimal.ROUND_HALF_EVEN: mode = RoundingMode.HALF_EVEN; break; case com.ibm.icu.math.BigDecimal.ROUND_HALF_UP: mode = RoundingMode.HALF_UP; break; case com.ibm.icu.math.BigDecimal.ROUND_UNNECESSARY: mode = RoundingMode.UNNECESSARY; break; case com.ibm.icu.math.BigDecimal.ROUND_UP: mode = RoundingMode.UP; break; } return mode; } @Override public int hashCode() { return fIcuNfmt.hashCode(); } @Override public boolean isGroupingUsed() { return fIcuNfmt.isGroupingUsed(); } @Override public boolean isParseIntegerOnly() { return fIcuNfmt.isParseIntegerOnly(); } @Override public Number parse(String source) throws ParseException { return fIcuNfmt.parse(source); } @Override public Number parse(String source, ParsePosition parsePosition) { return fIcuNfmt.parse(source, parsePosition); } //public Object parseObject(String source, ParsePosition pos) @Override public void setCurrency(Currency currency) { if (currency == null) { fIcuNfmt.setCurrency(null); } else { fIcuNfmt.setCurrency(com.ibm.icu.util.Currency.getInstance(currency.getCurrencyCode())); } } @Override public void setGroupingUsed(boolean newValue) { fIcuNfmt.setGroupingUsed(newValue); } @Override public void setMaximumFractionDigits(int newValue) { fIcuNfmt.setMaximumFractionDigits(newValue); } @Override public void setMaximumIntegerDigits(int newValue) { fIcuNfmt.setMaximumIntegerDigits(newValue); } @Override public void setMinimumFractionDigits(int newValue) { fIcuNfmt.setMinimumFractionDigits(newValue); } @Override public void setMinimumIntegerDigits(int newValue) { fIcuNfmt.setMinimumIntegerDigits(newValue); } @Override public void setParseIntegerOnly(boolean value) { fIcuNfmt.setParseIntegerOnly(value); } @Override public void setRoundingMode(RoundingMode roundingMode) { if (roundingMode.equals(RoundingMode.CEILING)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_CEILING); } else if (roundingMode.equals(RoundingMode.DOWN)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_DOWN); } else if (roundingMode.equals(RoundingMode.FLOOR)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_FLOOR); } else if (roundingMode.equals(RoundingMode.HALF_DOWN)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_DOWN); } else if (roundingMode.equals(RoundingMode.HALF_EVEN)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_EVEN); } else if (roundingMode.equals(RoundingMode.HALF_UP)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_UP); } else if (roundingMode.equals(RoundingMode.UNNECESSARY)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_UNNECESSARY); } else if (roundingMode.equals(RoundingMode.UP)) { fIcuNfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_UP); } else { throw new IllegalArgumentException("Invalid rounding mode was specified."); } } }