2 **********************************************************************
\r
3 * Copyright (c) 2003-2010, International Business Machines
\r
4 * Corporation and others. All Rights Reserved.
\r
5 **********************************************************************
\r
7 * Created: May 22 2003
\r
9 **********************************************************************
\r
11 package com.ibm.icu.dev.demo.number;
\r
12 import java.util.HashMap;
\r
13 import java.util.Locale;
\r
14 import java.util.Map;
\r
16 import com.ibm.icu.impl.Utility;
\r
17 import com.ibm.icu.text.DecimalFormat;
\r
18 import com.ibm.icu.text.DecimalFormatSymbols;
\r
19 import com.ibm.icu.text.NumberFormat;
\r
20 import com.ibm.icu.util.Currency;
\r
23 * Demonstration code to illustrate how to obtain ICU 2.6-like currency
\r
24 * behavior using pre-ICU 2.6 ICU4J.
\r
25 * @author Mark Davis
\r
27 public class CurrencyDemo {
\r
29 public static void main(String[] args) {
\r
30 testFormatHack(true);
\r
33 static NumberFormat getCurrencyFormat(Currency currency,
\r
34 Locale displayLocale,
\r
38 NumberFormat result = NumberFormat.getCurrencyInstance(displayLocale);
\r
39 result.setCurrency(currency);
\r
43 // ugly work-around for 2.4
\r
44 DecimalFormat result = (DecimalFormat)NumberFormat.getCurrencyInstance(displayLocale);
\r
45 HackCurrencyInfo hack = (HackCurrencyInfo)(hackData.get(currency.getCurrencyCode()));
\r
46 result.setMinimumFractionDigits(hack.decimals);
\r
47 result.setMaximumFractionDigits(hack.decimals);
\r
48 result.setRoundingIncrement(hack.rounding);
\r
49 DecimalFormatSymbols symbols = result.getDecimalFormatSymbols();
\r
50 symbols.setCurrencySymbol(hack.symbol);
\r
51 result.setDecimalFormatSymbols(symbols);
\r
55 static Map hackData = new HashMap();
\r
56 static class HackCurrencyInfo {
\r
60 HackCurrencyInfo(int decimals, double rounding, String symbol) {
\r
61 this.decimals = decimals;
\r
62 this.rounding = rounding;
\r
63 this.symbol = symbol;
\r
67 hackData.put("USD", new HackCurrencyInfo(2, 0, "$"));
\r
68 hackData.put("GBP", new HackCurrencyInfo(2, 0, "\u00A3"));
\r
69 hackData.put("JPY", new HackCurrencyInfo(0, 0, "\u00A5"));
\r
70 hackData.put("EUR", new HackCurrencyInfo(2, 0, "\u20AC"));
\r
74 * Walk through all locales and compare the output of the ICU26
\r
75 * currency format with the "hacked" currency format.
\r
76 * @param quiet if true, only display discrepancies. Otherwise,
\r
77 * display all results.
\r
79 static void testFormatHack(boolean quiet) {
\r
80 String[] testCurrencies = {"USD","GBP","JPY","EUR"};
\r
81 Locale[] testLocales = NumberFormat.getAvailableLocales();
\r
82 for (int i = 0; i < testLocales.length; ++i) {
\r
83 // since none of this should vary by country, we'll just do by language
\r
84 if (!testLocales[i].getCountry().equals("")) continue;
\r
85 boolean noOutput = true;
\r
87 System.out.println(testLocales[i].getDisplayName());
\r
90 for (int j = 0; j < testCurrencies.length; ++j) {
\r
91 NumberFormat nf26 = getCurrencyFormat(Currency.getInstance(testCurrencies[j]), testLocales[i], true);
\r
92 String str26 = nf26.format(1234.567);
\r
94 System.out.print("\t" + Utility.escape(str26));
\r
96 NumberFormat nf24 = getCurrencyFormat(Currency.getInstance(testCurrencies[j]), testLocales[i], false);
\r
97 String str24 = nf24.format(1234.567);
\r
98 if (!str24.equals(str26)) {
\r
100 System.out.println(testLocales[i].getDisplayName());
\r
104 System.out.print("\t" + Utility.escape(str26));
\r
106 System.out.print(" (" + Utility.escape(str24) + ")");
\r
110 System.out.println();
\r