/** * */ package com.trendrr.oss.casting; import com.trendrr.oss.StringHelper; import com.trendrr.oss.TypeCast; /** * @author Dustin Norlander * @created Nov 30, 2010 * */ public class NumberCaster extends TypeCaster<Number> { /* (non-Javadoc) * @see com.trendrr.oss.casting.TypeCaster#cast(java.lang.Object) */ @Override protected Number doCast(Class cls, Object obj) { try { if (obj instanceof Number) { Number num = (Number)obj; return this.fromNumber(cls, num); } //we remove characters that could resonably be associated with a number String str = TypeCast.cast(String.class, obj); if (str == null) return null; // We need to count on this string being only a number. // if we are too aggressive things like {this:70} will parse to a number when we don't want it to. str = StringHelper.removeAll(TypeCast.cast(String.class, obj), ' ', ',', '$').trim(); if (cls.equals(Long.class)) { return Long.parseLong(str); } else { //just parse to a double and try again. Double num = Double.parseDouble(str); if (num.isInfinite() || num.isNaN()) return null; return this.fromNumber(cls, num); } } catch (Exception x) { } return null; } private Number fromNumber(Class cls, Number num) { if (cls.equals(Number.class)) { return num; } if (cls.equals(Byte.class)) { return num.byteValue(); } if (cls.equals(Short.class)) { return num.shortValue(); } if (cls.equals(Integer.class)) { return num.intValue(); } if (cls.equals(Double.class)) { return num.doubleValue(); } if (cls.equals(Long.class)) { return num.longValue(); } if (cls.equals(Float.class)) { return num.floatValue(); } return null; } }