/**
* Implements the CFML Function lsparsecurrency
*/
package railo.runtime.functions.international;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.util.Locale;
import java.util.WeakHashMap;
import railo.runtime.PageContext;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.function.Function;
import railo.runtime.i18n.LocaleFactory;
import railo.runtime.op.Caster;
public final class LSParseCurrency implements Function {
private static final long serialVersionUID = -7023441119083818436L;
private static WeakHashMap currFormatter=new WeakHashMap();
private static WeakHashMap numbFormatter=new WeakHashMap();
public static String call(PageContext pc , String string) throws PageException {
return Caster.toString(toDoubleValue(pc.getLocale(),string,false));
}
public static String call(PageContext pc , String string,String strLocale) throws PageException {
return Caster.toString(toDoubleValue(strLocale==null?pc.getLocale():LocaleFactory.getLocale(strLocale),string,false));
}
public static synchronized double toDoubleValue(Locale locale,String str) throws PageException {
return toDoubleValue(locale, str, false);
}
public static synchronized double toDoubleValue(Locale locale,String str, boolean strict) throws PageException {
str=str.trim();
NumberFormat cnf=getCurrencyInstance(locale);
cnf.setParseIntegerOnly(false);
try {
return cnf.parse(str).doubleValue();
}
catch (ParseException e) {
String stripped=str.replaceFirst(cnf.getCurrency().getCurrencyCode(),"").trim();
NumberFormat nf=getInstance(locale);
ParsePosition pp = new ParsePosition(0);
double d = nf.parse(stripped,pp).doubleValue();
if (pp.getIndex() == 0 || (strict && stripped.length()!=pp.getIndex()))
throw new ExpressionException("Unparseable number [" + str + "]");
return d;
}
}
private static NumberFormat getInstance(Locale locale) {
Object o=numbFormatter.get(locale);
if(o!=null) return (NumberFormat) o;
NumberFormat nf=NumberFormat.getInstance(locale);
numbFormatter.put(locale,nf);
return nf;
}
private static NumberFormat getCurrencyInstance(Locale locale) {
Object o = currFormatter.get(locale);
if(o!=null) return (NumberFormat) o;
NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
currFormatter.put(locale,nf);
return nf;
}
}