1 16 package org.apache.cocoon.woody.datatype.convertor; 17 18 import org.outerj.i18n.I18nSupport; 19 import org.outerj.i18n.DecimalFormat; 20 21 import java.util.Locale ; 22 import java.text.ParseException ; 23 import java.math.BigDecimal ; 24 import java.math.BigInteger ; 25 26 46 public class FormattingDecimalConvertor implements Convertor { 47 private int variant; 48 49 private LocaleMap localizedPatterns; 50 51 private String nonLocalizedPattern; 52 53 public static final int INTEGER = 0; 54 public static final int NUMBER = 1; 55 public static final int CURRENCY = 2; 56 public static final int PERCENT = 3; 57 58 public FormattingDecimalConvertor() { 59 this.variant = getDefaultVariant(); 60 this.localizedPatterns = new LocaleMap(); 61 } 62 63 protected int getDefaultVariant() { 64 return NUMBER; 65 } 66 67 public Object convertFromString(String value, Locale locale, Convertor.FormatCache formatCache) { 68 DecimalFormat decimalFormat = getDecimalFormat(locale, formatCache); 69 Number decimalValue; 70 try { 71 decimalValue = decimalFormat.parse(value); 72 } catch (ParseException e) { 73 return null; 74 } 75 76 if (decimalValue instanceof BigDecimal ) { 77 } else if (decimalValue instanceof Integer ) { 79 decimalValue = new BigDecimal (decimalValue .intValue()); 80 } else if (decimalValue instanceof Long ) { 81 decimalValue = new BigDecimal (decimalValue.longValue()); 82 } else if (decimalValue instanceof Double ) { 83 decimalValue = new BigDecimal (decimalValue.doubleValue()); 84 } else if (decimalValue instanceof BigInteger ) { 85 decimalValue = new BigDecimal ((BigInteger )decimalValue); 86 } else { 87 return null; 88 } 89 90 return decimalValue; 91 } 92 93 public String convertToString(Object value, Locale locale, Convertor.FormatCache formatCache) { 94 DecimalFormat decimalFormat = getDecimalFormat(locale, formatCache); 95 return decimalFormat.format(value); 96 } 97 98 protected final DecimalFormat getDecimalFormat(Locale locale, Convertor.FormatCache formatCache) { 99 DecimalFormat decimalFormat = null; 100 if (formatCache != null) 101 decimalFormat = (DecimalFormat)formatCache.get(); 102 if (decimalFormat == null) { 103 decimalFormat = getDecimalFormat(locale); 104 if (formatCache != null) 105 formatCache.store(decimalFormat); 106 } 107 return decimalFormat; 108 } 109 110 private DecimalFormat getDecimalFormat(Locale locale) { 111 DecimalFormat decimalFormat = null; 112 113 switch (variant) { 114 case INTEGER: 115 decimalFormat = I18nSupport.getInstance().getIntegerFormat(locale); 116 break; 117 case NUMBER: 118 decimalFormat = I18nSupport.getInstance().getNumberFormat(locale); 119 break; 120 case CURRENCY: 121 decimalFormat = I18nSupport.getInstance().getCurrencyFormat(locale); 122 break; 123 case PERCENT: 124 decimalFormat = I18nSupport.getInstance().getPercentFormat(locale); 125 break; 126 } 127 128 String pattern = (String )localizedPatterns.get(locale); 129 130 if (pattern != null) 131 decimalFormat.applyLocalizedPattern(pattern); 132 else if (nonLocalizedPattern != null) 133 decimalFormat.applyPattern(nonLocalizedPattern); 134 135 return decimalFormat; 136 } 137 138 public void setVariant(int variant) { 139 if (variant != INTEGER && variant != NUMBER && variant != CURRENCY && variant != PERCENT) 140 throw new IllegalArgumentException ("Invalid value for variant parameter."); 141 this.variant = variant; 142 } 143 144 public void addFormattingPattern(Locale locale, String pattern) { 145 localizedPatterns.put(locale, pattern); 146 } 147 148 public void setNonLocalizedPattern(String pattern) { 149 this.nonLocalizedPattern = pattern; 150 } 151 152 public Class getTypeClass() { 153 return java.math.BigDecimal .class; 154 } 155 } 156 | Popular Tags |