package org.nutz.castor.castor;

import org.nutz.castor.Castor;
import org.nutz.castor.FailToCastObjectException;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;

/**
 * 根据一个字符串将其转换成 Number 类型。这里有几个规则
 * <ul>
 * <li>如果 Number 为原生类型，空白串将被转换成 0
 * <li>如果 Number 为外覆类，空白串将被转换成 null
 * </ul>
 * 
 * 如果转换失败，将抛出 FailToCastObjectException
 * 
 * @author zozoh(zozohtnt@gmail.com)
 */
public class String2Number extends Castor<String, Number> {

    @Override
    public Number cast(String src, Class<?> toType, String... args) {
        if (Strings.isBlank(src)) {
            if (toType.isPrimitive())
                return 0;
            else
                return null;
        }
        try {
            return (Number) Mirror.me(toType)
                                    .getWrapperClass()
                                    .getConstructor(String.class)
                                    .newInstance(src);
        }
        catch (Exception e) {
            throw new FailToCastObjectException(String.format(    "Fail to cast '%s' to <%s>",
                                                                src,
                                                                toType.getName()), Lang.unwrapThrow(e));
        }
    }
}

@@ -321,17 +321,16 @@
 %3C/ul%3E%0A *
- 
 %0A * %E5%A6%82%E6%9E%9C%E8%BD%AC%E6%8D%A2
@@ -364,17 +364,16 @@
 ption%0A *
- 
 %0A * @aut
@@ -699,32 +699,171 @@
 null;%0A        %7D%0A
+        if (!toType.isPrimitive() && (%22null%22.equals(src) %7C%7C %22NULL%22.equals(src) %7C%7C %22Null%22.equals(src)))%7B%0A            return null;%0A        %7D%0A
         try %7B%0A  
@@ -926,32 +926,16 @@
         
-  
-              
 .getWrap
@@ -965,32 +965,16 @@
         
-         
-       
 .getCons
@@ -995,32 +995,16 @@
 .class)%0A
-                
         
@@ -1193,101 +1193,13 @@
     
-                                            src,%0A                                            
+src,%0A
     

fix #418