package com.googlecode.aviator.runtime.function.system;
import java.util.Map;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.type.AviatorDouble;
import com.googlecode.aviator.runtime.type.AviatorObject;
/**
* Cast value to double,double(a) eg.
*
* @author dennis
* @Date 2011-6-23
* @since 1.1.1
*
*/
public class DoubleFunction extends AbstractFunction {
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
switch (arg1.getAviatorType()) {
case Boolean:
return new AviatorDouble(arg1.booleanValue(env) ? 1 : 0);
case JavaType:
Object obj = arg1.getValue(env);
if (obj instanceof Number) {
return new AviatorDouble(((Number) obj).doubleValue());
}
else if (obj instanceof String) {
return new AviatorDouble(Double.parseDouble((String) obj));
}
else if (obj instanceof Character) {
return new AviatorDouble(Double.parseDouble(String.valueOf(obj)));
}
else {
throw new ClassCastException("Could not cast " + obj.getClass().getName() + " to double");
}
case String:
return new AviatorDouble(Double.parseDouble((String) arg1.getValue(env)));
case Long:
case Double:
return new AviatorDouble(((Number) arg1.getValue(env)).doubleValue());
default:
throw new ClassCastException("Could not cast " + arg1 + " to double");
}
}
public String getName() {
return "double";
}
}