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