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 }