litesoft
@ 804
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.core.simpletypes.currency; import java.util.*; import org.litesoft.core.simpletypes.*; import org.litesoft.core.simpletypes.nonpublic.*; import org.litesoft.core.typeutils.*; import org.litesoft.core.util.*; public class SimpleCurrency extends CompareSupport<SimpleCurrency> implements SimpleType { public static final SimpleCurrency US = new SimpleCurrency( "USD", 2, NumericFormatControl.US ); public static final SimpleCurrency CA_English = new SimpleCurrency( "CAD", 2, NumericFormatControl.COMMA_DOT ); public static final SimpleCurrency CA_French = new SimpleCurrency( "CAD", 2, NumericFormatControl.SPACE_COMMA ); public static final SimpleCurrency EURO = new SimpleCurrency( "EUR", 2, NumericFormatControl.SPACE_COMMA ); private static final HashMap<String, SimpleCurrency> CURRENCIES = new HashMap<String, SimpleCurrency>(); public static synchronized SimpleCurrency get( String pCurrencyCode ) { return (pCurrencyCode != null) ? CURRENCIES.get( pCurrencyCode ) : null; } public static synchronized void add( SimpleCurrency pCurrency ) { if ( pCurrency != null ) { String zCode = pCurrency.getCurrencyCode(); if ( CURRENCIES.containsKey( zCode ) ) { throw new IllegalStateException( "Currency '" + zCode + "' already registered" ); } CURRENCIES.put( zCode, pCurrency ); } } public static synchronized void replace( SimpleCurrency pCurrency ) { if ( pCurrency != null ) { String zCode = pCurrency.getCurrencyCode(); if ( !CURRENCIES.containsKey( zCode ) ) { throw new IllegalStateException( "Currency '" + zCode + "' NOT already registered" ); } CURRENCIES.put( zCode, pCurrency ); } } static { add( US ); add( CA_English ); add( EURO ); } private String mCurrencyCode; // ISO 4217 private int mDefaultFractionDigits; private NumericFormatControl mFormatControl; /** * @deprecated - for Serialization */ protected SimpleCurrency() { } public SimpleCurrency( String pCurrencyCode, int pDefaultFractionDigits, NumericFormatControl pFormatControl ) { mCurrencyCode = UtilsCommon.assertNotNullNotEmpty( "CurrencyCode", pCurrencyCode ); if ( mCurrencyCode.length() != 3 ) { throw new IllegalArgumentException( "Currency Codes should be 3 characters long per ISO 4217" ); } if ( (mDefaultFractionDigits = pDefaultFractionDigits) < 0 ) { throw new IllegalArgumentException( "DefaultFractionDigits can not be < 0" ); } Objects.assertNotNull( "NumericFormatControl", mFormatControl = pFormatControl ); } public String getCurrencyCode() { return mCurrencyCode; } public int getDefaultFractionDigits() { return mDefaultFractionDigits; } public NumericFormatControl getFormatControl() { return mFormatControl; } public boolean equals( Object o ) { return (this == o) || // ((o instanceof SimpleCurrency) && equals( (SimpleCurrency) o )); } public boolean equals( SimpleCurrency them ) { return (this == them) || // ((them != null) // && equal( this.mCurrencyCode, them.mCurrencyCode ) // && equal( this.mDefaultFractionDigits, them.mDefaultFractionDigits ) // ); } public int hashCode() { return hashCodeEm( calcHashCode( mDefaultFractionDigits ), // calcHashCode( mCurrencyCode ) ); } public int compareTo( SimpleCurrency them ) { return compareEm( compare( this.mCurrencyCode, them.mCurrencyCode ), // compare( this.mDefaultFractionDigits, them.mDefaultFractionDigits ) ); } public String toString() { return mCurrencyCode; } public String desiccate() { return mCurrencyCode + '.' + mDefaultFractionDigits + '|' + mFormatControl.desiccate(); } public static SimpleCurrency rehydrate( String pDesiccated ) throws IllegalArgumentException { pDesiccated = Strings.deNull( pDesiccated ); int dpAt = pDesiccated.indexOf( '.' ); int nfcSepAt = pDesiccated.indexOf( '|' ); if ( (3 <= dpAt) && ((dpAt + 1) < nfcSepAt) ) { try { String zCurrencyCode = pDesiccated.substring( 0, dpAt ); int zDefaultFractionDigits = Integer.parseInt( pDesiccated.substring( dpAt + 1, nfcSepAt ).trim() ); return new SimpleCurrency( zCurrencyCode, zDefaultFractionDigits, // NumericFormatControl.rehydrate( pDesiccated.substring( nfcSepAt + 1 ) ) ); } catch ( NumberFormatException e ) { // Fall Thru } } throw new IllegalArgumentException( "Unable to SimpleCurrency.rehydrate( \"" + pDesiccated + "\") form looks like: USD.2|#,###.#" ); } } |