package name.abuchen.portfolio.ui.util; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; import java.text.ParseException; import java.util.regex.Matcher; import java.util.regex.Pattern; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.ui.Messages; public class StringToCurrencyConverter implements IValidatingConverter { private final Pattern pattern; private final NumberFormat full; private final int factor; public StringToCurrencyConverter(Values<?> type) { this.factor = type.factor(); DecimalFormatSymbols symbols = new DecimalFormatSymbols(); pattern = Pattern.compile("^([\\d" + symbols.getGroupingSeparator() + "]*)(" //$NON-NLS-1$ //$NON-NLS-2$ + symbols.getDecimalSeparator() + "(\\d*))?$"); //$NON-NLS-1$ full = new DecimalFormat("#,###"); //$NON-NLS-1$ } @Override public Object getFromType() { return String.class; } @Override public Object getToType() { return long.class; } @Override public Object convert(Object fromObject) { String value = (String) fromObject; value = value.trim(); try { long result = 0; for (String part : value.split("\\+")) //$NON-NLS-1$ result += convertToLong(part.trim()); return Long.valueOf(result); } catch (ParseException e) { throw new IllegalArgumentException(e); } } private long convertToLong(String part) throws ParseException { Matcher m = pattern.matcher(String.valueOf(part)); if (!m.matches()) throw new IllegalArgumentException(String.format(Messages.CellEditor_NotANumber, part)); String strBefore = m.group(1); Number before = strBefore.trim().length() > 0 ? full.parse(strBefore) : Long.valueOf(0); String strAfter = m.group(3); long after = 0; if (strAfter != null && strAfter.length() > 0) { int length = (int) Math.log10(factor); if (strAfter.length() > length) strAfter = strAfter.substring(0, length); after = Long.parseLong(strAfter); for (int ii = strAfter.length(); ii < length; ii++) after *= 10; } return before.longValue() * factor + after; } }