]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/demos/src/com/ibm/icu/dev/demo/number/CurrencyDemo.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / demos / src / com / ibm / icu / dev / demo / number / CurrencyDemo.java
1 /*\r
2 **********************************************************************\r
3 * Copyright (c) 2003-2010, International Business Machines\r
4 * Corporation and others.  All Rights Reserved.\r
5 **********************************************************************\r
6 * Author: Mark Davis\r
7 * Created: May 22 2003\r
8 * Since: ICU 2.6\r
9 **********************************************************************\r
10 */\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
15 \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
21 \r
22 /**\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
26  */\r
27 public class CurrencyDemo {\r
28 \r
29     public static void main(String[] args) {\r
30         testFormatHack(true);\r
31     }\r
32 \r
33     static NumberFormat getCurrencyFormat(Currency currency,\r
34                                           Locale displayLocale,\r
35                                           boolean ICU26) {\r
36         // code for ICU 2.6\r
37         if (ICU26) {\r
38             NumberFormat result = NumberFormat.getCurrencyInstance(displayLocale);\r
39             result.setCurrency(currency);\r
40             return result;\r
41         }\r
42 \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
52         return result;\r
53     }\r
54         \r
55     static Map hackData = new HashMap();\r
56     static class HackCurrencyInfo {\r
57         int decimals;\r
58         double rounding;\r
59         String symbol;\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
64         }\r
65     }\r
66     static {\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
71     }\r
72 \r
73     /**\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
78      */\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
86             if (!quiet) {\r
87                 System.out.println(testLocales[i].getDisplayName());\r
88                 noOutput = false;\r
89             }\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
93                 if (!quiet) {\r
94                     System.out.print("\t" + Utility.escape(str26));\r
95                 }\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
99                     if (noOutput) {\r
100                         System.out.println(testLocales[i].getDisplayName());\r
101                         noOutput = false;\r
102                     }\r
103                     if (quiet) {\r
104                         System.out.print("\t" + Utility.escape(str26));\r
105                     }\r
106                     System.out.print(" (" + Utility.escape(str24) + ")");\r
107                 }\r
108             }\r
109             if (!noOutput) {\r
110                 System.out.println();\r
111             }\r
112         }\r
113     }\r
114 }\r