| package org.eclipse.osbp.runtime.web.vaadin.common.converter; |
| |
| import java.math.BigDecimal; |
| import java.math.BigInteger; |
| import java.text.DecimalFormat; |
| import java.text.DecimalFormatSymbols; |
| import java.util.Locale; |
| |
| import org.apache.commons.lang3.StringEscapeUtils; |
| |
| import com.vaadin.data.util.converter.AbstractStringToNumberConverter; |
| |
| @SuppressWarnings("serial") |
| public class StringToFormattedNumberConverter extends |
| AbstractStringToNumberConverter<Number> { |
| private final String format; |
| private final Class<? extends Number> resultType; |
| |
| public StringToFormattedNumberConverter(String format, |
| Class<? extends Number> resultType) { |
| this.format = format; |
| this.resultType = resultType; |
| } |
| |
| @Override |
| public String convertToPresentation(Number value, |
| Class<? extends String> targetType, Locale locale) |
| throws ConversionException { |
| if (value == null) { |
| return null; |
| } |
| |
| return getFormat(locale).format(value); |
| } |
| |
| @Override |
| public Number convertToModel(String value, |
| Class<? extends Number> targetType, Locale locale) |
| throws ConversionException { |
| Number n = convertToNumber(value, targetType, locale); |
| return n; |
| } |
| |
| @Override |
| protected Number convertToNumber(String value, |
| Class<? extends Number> targetType, Locale locale) |
| throws ConversionException { |
| Number number = super.convertToNumber(value, targetType, locale); |
| return number == null ? number |
| : convertToResultType(number, resultType); |
| } |
| |
| protected DecimalFormat getFormat(Locale locale) { |
| if (locale == null) { |
| locale = Locale.getDefault(); |
| } |
| DecimalFormat decimalFormat = null; |
| try { |
| decimalFormat = new DecimalFormat( |
| StringEscapeUtils.unescapeHtml4(format), |
| new DecimalFormatSymbols(locale)); |
| } catch (IllegalArgumentException e) { |
| throw new ConversionException(String.format( |
| "formatter %s is invalid for decimal numbers: %s", format, |
| e.toString())); |
| } |
| |
| return decimalFormat; |
| } |
| |
| @Override |
| public Class<Number> getModelType() { |
| return Number.class; |
| } |
| |
| public static Number convertToResultType(final Number number, |
| final Class<? extends Number> targetClass) { |
| if (Integer.class.isAssignableFrom(targetClass) |
| || Integer.TYPE.isAssignableFrom(targetClass)) { |
| return number.intValue(); |
| } else if (Long.class.isAssignableFrom(targetClass) |
| || Long.TYPE.isAssignableFrom(targetClass)) { |
| return number.longValue(); |
| } else if (Double.class.isAssignableFrom(targetClass) |
| || Double.TYPE.isAssignableFrom(targetClass)) { |
| return number.doubleValue(); |
| } else if (Float.class.isAssignableFrom(targetClass) |
| || Float.TYPE.isAssignableFrom(targetClass)) { |
| return number.floatValue(); |
| } else if (BigDecimal.class.isAssignableFrom(targetClass)) { |
| return new BigDecimal(number.doubleValue()); |
| } else if (BigInteger.class.isAssignableFrom(targetClass)) { |
| return new BigInteger(String.valueOf(number.longValue())); |
| } else if (Short.class.isAssignableFrom(targetClass) |
| || Short.TYPE.isAssignableFrom(targetClass)) { |
| return number.shortValue(); |
| } |
| return number; |
| } |
| } |