1 package org.weda.converter.impl; 2 3 import java.text.DecimalFormat; 4 import java.util.HashMap; 5 import java.util.Map; 6 import org.weda.converter.ValueTypeConverter; 7 import org.weda.converter.ValueTypeConverterException; 8 9 /** 10 * 11 * @author tim 12 */ 13 public class NumberConverter extends AbstractConverter { 14 15 private final static ThreadLocal formatters = new ThreadLocal(){ 16 protected Object initialValue(){ 17 return new HashMap(); 18 } 19 }; 20 21 22 public Object convert(Class toType, Object value, String pattern) 23 throws ValueTypeConverterException 24 { 25 try{ 26 if (String.class.equals(toType) && value instanceof Number){ 27 if (pattern==null) 28 return value.toString(); 29 else{ 30 DecimalFormat formatter = 31 (DecimalFormat)((Map)formatters.get()).get(pattern); 32 if (formatter==null){ 33 formatter = new DecimalFormat(pattern); 34 ((Map)formatters.get()).put(pattern, formatter); 35 } 36 return formatter.format(value); 37 } 38 }else if ( Number.class.isAssignableFrom(toType) 39 && value instanceof String) 40 { 41 if (pattern==null) 42 return toType.getConstructor(String.class) 43 .newInstance(value); 44 else{ 45 DecimalFormat formatter = 46 (DecimalFormat)((Map)formatters.get()).get(pattern); 47 if (formatter==null){ 48 formatter = new DecimalFormat(pattern); 49 ((Map)formatters.get()).put(pattern, formatter); 50 } 51 Number num=formatter.parse((String)value); 52 if (toType.equals(num.getClass())) 53 return num; 54 else if (toType.equals(Byte.class)) 55 return num.byteValue(); 56 else if (toType.equals(Double.class)) 57 return num.doubleValue(); 58 else if (toType.equals(Float.class)) 59 return num.floatValue(); 60 else if (toType.equals(Integer.class)) 61 return num.intValue(); 62 else if (toType.equals(Long.class)) 63 return num.longValue(); 64 else if (toType.equals(Short.class)) 65 return num.shortValue(); 66 else 67 throw new ValueTypeConverterException( 68 getMessages().format( 69 "InvalidNumberType" 70 , num.getClass().getName())); 71 } 72 }else 73 throw new ValueTypeConverterException( 74 getMessages().format( 75 "InvalidType" 76 , toType.getName(), value.getClass().getName())); 77 }catch(Exception e){ 78 throw new ValueTypeConverterException( 79 getMessages().format( 80 "ConversionError" 81 , value, toType.getName()) 82 , e); 83 } 84 } 85 }