1 16 package org.apache.cocoon.forms.datatype.convertor; 17 18 import org.xml.sax.ContentHandler ; 19 import org.xml.sax.SAXException ; 20 21 import java.util.Locale ; 22 import java.text.DecimalFormat ; 23 import java.text.NumberFormat ; 24 import java.text.ParseException ; 25 import java.math.BigDecimal ; 26 import java.math.BigInteger ; 27 28 43 public class FormattingDecimalConvertor 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 FormattingDecimalConvertor() { 56 this.variant = getDefaultVariant(); 57 this.localizedPatterns = new LocaleMap(); 58 } 59 60 protected int getDefaultVariant() { 61 return NUMBER; 62 } 63 64 public ConversionResult convertFromString(String value, Locale locale, Convertor.FormatCache formatCache) { 65 value = value.replace(' ', (char)160); 67 DecimalFormat decimalFormat = getDecimalFormat(locale, formatCache); 68 Number decimalValue; 69 try { 70 decimalValue = decimalFormat.parse(value); 71 } catch (ParseException e) { 72 return ConversionResult.create("decimal"); 73 } 74 75 if (decimalValue instanceof BigDecimal ) { 76 } else if (decimalValue instanceof Integer ) { 78 decimalValue = new BigDecimal (decimalValue.intValue()); 79 } else if (decimalValue instanceof Long ) { 80 decimalValue = new BigDecimal (decimalValue.longValue()); 81 } else if (decimalValue instanceof Double ) { 82 decimalValue = new BigDecimal (decimalValue.doubleValue()); 83 } else if (decimalValue instanceof BigInteger ) { 84 decimalValue = new BigDecimal ((BigInteger )decimalValue); 85 } else { 86 return ConversionResult.create("decimal"); 87 } 88 return new ConversionResult(decimalValue); 89 } 90 91 public String convertToString(Object value, Locale locale, Convertor.FormatCache formatCache) { 92 DecimalFormat decimalFormat = getDecimalFormat(locale, formatCache); 93 return decimalFormat.format(value); 94 } 95 96 protected final DecimalFormat getDecimalFormat(Locale locale, Convertor.FormatCache formatCache) { 97 DecimalFormat decimalFormat = null; 98 if (formatCache != null) 99 decimalFormat = (DecimalFormat )formatCache.get(); 100 if (decimalFormat == null) { 101 decimalFormat = getDecimalFormat(locale); 102 if (formatCache != null) 103 formatCache.store(decimalFormat); 104 } 105 return decimalFormat; 106 } 107 108 private DecimalFormat getDecimalFormat(Locale locale) { 109 DecimalFormat decimalFormat = null; 110 111 switch (variant) { 112 case INTEGER: 113 decimalFormat = (DecimalFormat )NumberFormat.getNumberInstance(locale); 114 decimalFormat.setMaximumFractionDigits(0); 115 decimalFormat.setDecimalSeparatorAlwaysShown(false); 116 decimalFormat.setParseIntegerOnly(true); 117 break; 118 case NUMBER: 119 decimalFormat = (DecimalFormat )NumberFormat.getNumberInstance(locale); 120 break; 121 case CURRENCY: 122 decimalFormat = (DecimalFormat )NumberFormat.getCurrencyInstance(locale); 123 break; 124 case PERCENT: 125 decimalFormat = (DecimalFormat )NumberFormat.getPercentInstance(locale); 126 break; 127 } 128 129 String pattern = (String )localizedPatterns.get(locale); 130 131 if (pattern != null) { 132 decimalFormat.applyPattern(pattern); 133 } else if (nonLocalizedPattern != null) { 134 decimalFormat.applyPattern(nonLocalizedPattern); 135 } 136 return decimalFormat; 137 } 138 139 public void setVariant(int variant) { 140 if (variant != INTEGER && variant != NUMBER && variant != CURRENCY && variant != PERCENT) 141 throw new IllegalArgumentException ("Invalid value for variant parameter."); 142 this.variant = variant; 143 } 144 145 public void addFormattingPattern(Locale locale, String pattern) { 146 localizedPatterns.put(locale, pattern); 147 } 148 149 public void setNonLocalizedPattern(String pattern) { 150 this.nonLocalizedPattern = pattern; 151 } 152 153 public Class getTypeClass() { 154 return java.math.BigDecimal .class; 155 } 156 157 public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException { 158 } 160 } 161 | Popular Tags |