001
002 package data;
003
004 import java.text.NumberFormat;
005 import java.text.ParseException;
006 import java.util.Locale;
007
008 import data.ooimpl.CatalogImpl;
009 import data.ooimpl.CurrencyItemImpl;
010
011 /**
012 * Abstract Java implementation of the {@link Currency} interface.
013 *
014 * @author Thomas Medack
015 * @version 3.0
016 */
017 public abstract class AbstractCurrency extends CatalogImpl implements Currency {
018
019 /**
020 * Data container for names and values of CurrencyItems.
021 */
022 protected class CurrencyItemData {
023 private String name;
024 private int value;
025
026 /**
027 * Constructor
028 *
029 * @param name the name of the CurrencyItem.
030 * @param value the appropriate value of the CurrencyItem.
031 */
032 public CurrencyItemData(String name, int value) {
033 this.value = value;
034 this.name = name;
035 }
036
037 /**
038 * Returns the name of a CurrencyItem in this data container.
039 *
040 * @return the name of the CurrencyItem.
041 */
042 public String getName() {
043 return name;
044 }
045
046 /**
047 * Returns the value of a CurrencyItem in this data container.
048 *
049 * @return the value of the CurrencyItem.
050 */
051 public int getValue() {
052 return value;
053 }
054 }
055
056 /**
057 * Tool used to format and parse currency values.
058 *
059 * @serial
060 */
061 private NumberFormat m_nfFormatter;
062
063 /**
064 * Create a new, initially empty AbstractCurrency for the given locale.
065 *
066 * @param sName the name of the currency to create.
067 * @param l the locale that determines how currency values will be formatted.
068 */
069 public AbstractCurrency(String sName, Locale l) {
070 super(sName);
071
072 m_nfFormatter = NumberFormat.getCurrencyInstance(l);
073
074 initCurrencyItems();
075 }
076
077 /**
078 * Create a new AbstractCurrency with a default locale of {@link Locale#GERMANY} and fill it.
079 *
080 * @param sName the name of the new currency.
081 */
082 public AbstractCurrency(String sName) {
083 this(sName, Locale.GERMANY);
084 }
085
086 /**
087 * Initializes all CurrencyItems in this container with names and values.
088 */
089 private void initCurrencyItems() {
090 CurrencyItemData[] data = getCurrencyItemData();
091
092 for (int i = 0; i < data.length; i++) {
093 add(new CurrencyItemImpl(data[i].getName(), data[i].getValue()), null);
094 }
095 }
096
097 /**
098 * Try to interpret the given {@link String} according to the currency format of the specific currency.
099 *
100 * @override Always
101 * @param s the text to be parsed
102 * @return the interpreted value in the smallest unit of the currency.
103 * @exception ParseException if the input could not be parsed.
104 */
105 public NumberValue parse(String s) throws ParseException {
106 int j = 1;
107 for (int i = 1; i <= m_nfFormatter.getMinimumFractionDigits(); i++) {
108 j *= 10;
109 }
110
111 // 10/27/2000-sz9: Fixed to use round instead a simple cast to int.
112 return new IntegerValue((int)java.lang.Math.round(m_nfFormatter.parse(s).doubleValue() * j));
113 }
114
115 /**
116 * Convert the given value into a {@link String} representation according to the currency format of the
117 * specific currency. <code>nv</code> must be given in the smallest unit of the currency, i.e. if you want
118 * to specify 5,05 DM <code>nv</code> should be 505.
119 *
120 * @override Always
121 * @param nv the value to be converted
122 * @return formatted String.
123 */
124 public String toString(NumberValue nv) {
125 int j = 1;
126 for (int i = 1; i <= m_nfFormatter.getMinimumFractionDigits(); i++) {
127 j *= 10;
128 }
129
130 return m_nfFormatter.format(nv.getValue().doubleValue() / j);
131 }
132
133 /**
134 * This abstract method allows the programmer to choose the names and values of the
135 * CurrencyItems (EURO, DM, ...).
136 *
137 * A complete list of data containers, which always contain pairs of name and value, has to be returned.
138 * The single CurrencyItems can be found in the Catalog (Currency) with those names.
139 *
140 * @return an Array of data containers that contain names and values of CurrencyItems to be added.
141 */
142 protected abstract CurrencyItemData[] getCurrencyItemData();
143 }