package org.nutz.castor.castor;
import org.nutz.castor.Castor;
import org.nutz.castor.FailToCastObjectException;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
/**
* 根据一个字符串将其转换成 Number 类型。这里有几个规则
* <ul>
* <li>如果 Number 为原生类型,空白串将被转换成 0
* <li>如果 Number 为外覆类,空白串将被转换成 null
* </ul>
*
* 如果转换失败,将抛出 FailToCastObjectException
*
* @author zozoh(zozohtnt@gmail.com)
*/
public abstract class String2Number<T> extends Castor<String, T> {
protected boolean _isNull(String str) {
return Strings.isBlank(str) || "null".equalsIgnoreCase(str);
}
protected abstract T getPrimitiveDefaultValue();
protected abstract T valueOf(String str);
@Override
public T cast(String src, Class<?> toType, String... args) {
if (Strings.isBlank(src) || "null".equalsIgnoreCase(src)) {
return toType.isPrimitive() ? getPrimitiveDefaultValue() : null;
}
if (!toType.isPrimitive()
&& ("null".equals(src) || "NULL".equals(src) || "Null".equals(src))) {
return null;
}
try {
return valueOf(src);
}
catch (Exception e) {
throw new FailToCastObjectException(String.format("Fail to cast '%s' to <%s>",
src,
toType.getName()),
Lang.unwrapThrow(e));
}
}
}