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