package railo.runtime.functions.string; import railo.commons.lang.StringUtil; import railo.runtime.PageContext; import railo.runtime.exp.ExpressionException; import railo.runtime.exp.PageException; import railo.runtime.op.Caster; public class ParseNumber { private static final int BIN=2; private static final int OCT=8; private static final int DEC=10; private static final int HEX=16; public static double call(PageContext pc , String strNumber) throws PageException { return call(pc,strNumber,null); } public static double call(PageContext pc , String strNumber,String strRadix) throws PageException { return invoke(strNumber, strRadix); } public static double invoke(String strNumber,String strRadix, double defaultValue) { try { return invoke(strNumber, strRadix); } catch (PageException e) { return defaultValue; } } public static double invoke(String strNumber,String strRadix) throws PageException { strNumber=strNumber.trim(); int radix=DEC; if(strRadix==null) { if(StringUtil.startsWithIgnoreCase(strNumber, "0x")){ radix=HEX; strNumber=strNumber.substring(2); } else if(strNumber.startsWith("#")){ radix=HEX; strNumber=strNumber.substring(1); } else if(strNumber.startsWith("0") && strNumber.length()>1){ radix=OCT; strNumber=strNumber.substring(1); } } else { strRadix=strRadix.trim().toLowerCase(); if(strRadix.startsWith("bin"))radix=BIN; else if(strRadix.startsWith("oct"))radix=OCT; else if(strRadix.startsWith("dec"))radix=DEC; else if(strRadix.startsWith("hex")){ if(StringUtil.startsWithIgnoreCase(strNumber, "0x")) strNumber=strNumber.substring(2); else if(strNumber.startsWith("#")) strNumber=strNumber.substring(1); radix=HEX; } else throw new ExpressionException("invalid radix defintions, valid vales are [bin,oct,dec,hex]"); } if(radix==OCT && strNumber.indexOf('9')!=-1) throw new ExpressionException("digit [9] is out of range for a octal number"); if(strNumber.indexOf('.')!=-1 && radix!=DEC) throw new ExpressionException("the radix con only be [dec] for floating point numbers"); if(radix==DEC) { return Caster.toDoubleValue(strNumber); } return Integer.parseInt(strNumber,radix); } }