001    package railo.runtime.functions.other;
002    
003    import railo.runtime.PageContext;
004    import railo.runtime.exp.FunctionException;
005    import railo.runtime.exp.PageException;
006    import railo.runtime.op.Caster;
007    import railo.runtime.op.Decision;
008    
009    public class ToNumeric {
010            public static double call(PageContext pc , Object value) throws PageException {
011                    return Caster.toDoubleValue(value);
012            }
013            public static double call(PageContext pc , Object value, Object oRadix) throws PageException {
014                    if(oRadix==null) return call(pc, value);
015                    int radix;
016                    if(Decision.isNumeric(oRadix)){
017                            radix=Caster.toIntValue(oRadix);
018                            if(radix<Character.MIN_RADIX || radix>Character.MAX_RADIX)
019                                    throw invalidRadix(pc, Caster.toString(radix));
020                    }
021                    else {
022                            String str = Caster.toString(oRadix).trim().toLowerCase();
023                            if("bin".equals(str)) radix=2;
024                            else if("oct".equals(str)) radix=8;
025                            else if("dec".equals(str)) radix=10;
026                            else if("hex".equals(str)) radix=16;
027                            else throw invalidRadix(pc,str);
028                    }
029                    
030                    return (double)Integer.parseInt(Caster.toString(value), radix);
031            }
032            
033            private static FunctionException invalidRadix(PageContext pc , String radix) {
034                    return new FunctionException(pc, "ToNumeric", 2, "radix", "invalid value ["+radix+"], valid values are ["+Character.MIN_RADIX+"-"+Character.MAX_RADIX+",bin,oct,dec,hex]");
035            }
036    }