View Javadoc

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  }