blob: 57eb5dc7c53a17ca46706c3d890d4194e773ab61 [file] [log] [blame]
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;
}
}