package com.taobao.tddl.common.utils.convertor; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * string <-> common对象 之间的转化 * * <pre> * common对象范围:8种Primitive和对应的Java类型,BigDecimal, BigInteger * * </pre> * * @author jianghang 2011-5-25 下午11:11:25 */ public class StringAndCommonConvertor { /** * string -> common对象的转化 */ public static class StringToCommon extends AbastactConvertor { protected static final Set TRUE_STRINGS = new HashSet(Arrays.asList(new String[] { "true", "on", "yes", "y" })); protected static final Set FALSE_STRINGS = new HashSet(Arrays.asList(new String[] { "false", "null", "nul", "nil", "off", "no", "n" })); protected Boolean booleanConvert(Object value) { if (value instanceof Boolean) { return (Boolean) value; } if (value instanceof Number) { return (Math.abs(((Number) value).doubleValue()) < Float.MIN_VALUE) ? Boolean.FALSE : Boolean.TRUE; } if (value instanceof String) { String strValue = ((String) value).trim(); try { return (Integer.parseInt(strValue) == 0) ? Boolean.FALSE : Boolean.TRUE; } catch (NumberFormatException e) { strValue = strValue.toLowerCase(); if (TRUE_STRINGS.contains(strValue)) { return Boolean.TRUE; } if (FALSE_STRINGS.contains(strValue)) { return Boolean.FALSE; } } } throw new ConvertorException("Unsupported convert: [" + String.class + "," + Boolean.class.getName() + "]"); } protected Character charConvert(Object value) { if (value instanceof Character) { return (Character) value; } if (value instanceof Number) { return new Character((char) ((Number) value).intValue()); } if (value instanceof String) { String strValue = ((String) value).trim(); try { return new Character((char) Integer.parseInt(strValue)); } catch (NumberFormatException e) { } } throw new ConvertorException("Unsupported convert: [" + String.class + "," + Character.class.getName() + "]"); } @Override public Object convert(Object src, Class destClass) { if (String.class.isInstance(src)) { // src必须是String String str = (String) src; if (destClass == Double.class || destClass == double.class) { return Double.valueOf(str); } if (destClass == Float.class || destClass == float.class) { return Float.valueOf(str); } if (destClass == Boolean.class || destClass == boolean.class) { return booleanConvert(str); } if (destClass == Integer.class || destClass == int.class) { return Integer.valueOf(str); } if (destClass == Short.class || destClass == short.class) { return Short.valueOf(str); } if (destClass == Long.class || destClass == long.class) { return Long.valueOf(str); } if (destClass == Byte.class || destClass == byte.class) { return Byte.valueOf(str); } if (destClass == Character.class || destClass == char.class) { return charConvert(str); // 只取第一个字符 } if (destClass == BigDecimal.class) { return new BigDecimal(str); } if (destClass == BigInteger.class) { return new BigInteger(str); } } throw new ConvertorException("Unsupported convert: [" + src + "," + destClass.getName() + "]"); } } }