[
https://issues.apache.org/jira/browse/BEANUTILS-282?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Niall Pemberton resolved BEANUTILS-282.
---------------------------------------
Resolution: Duplicate
Fix Version/s: 1.8.0
> BigDecimalLocaleConverter returns Long object
> ---------------------------------------------
>
> Key: BEANUTILS-282
> URL: https://issues.apache.org/jira/browse/BEANUTILS-282
> Project: Commons BeanUtils
> Issue Type: Bug
> Components: Locale BeanUtils / Converters
> Affects Versions: 1.7.0
> Reporter: Josef Cacek
> Fix For: 1.8.0
>
>
> BigDecimalLocaleConverter returns Long object instead of BigDecimal when no
> decimal places are in the parsed number.
> Problem is in the method DecimalLocaleConverter.parse(Object, String) which
> uses DecimalFormat.getInstance(locale).parse(String). The getInstance method
> is factory method from NumberFormat and not DecimalFormat, so there is no
> guarantee of returned type.
> Here is the sample which shows the problem:
> import java.math.BigDecimal;
> import java.text.NumberFormat;
> import java.util.Locale;
> import
> org.apache.commons.beanutils.locale.converters.BigDecimalLocaleConverter;
> public class Test {
>
> public static void main(String args[]) {
> Locale tmpLoc = new Locale("de","AT");
> NumberFormat nf = NumberFormat.getNumberInstance(tmpLoc);
> String tmpNr = nf.format(new BigDecimal("5"));
> BigDecimalLocaleConverter tmpBdlc = new
> BigDecimalLocaleConverter(tmpLoc);
> Object tmpConverted = tmpBdlc.convert(tmpNr);
> System.out.println("String value: " + tmpNr);
> System.out.println("Number value: " + tmpConverted);
> System.out.println(tmpConverted==null?"No class":"Class: " +
> tmpConverted.getClass());
> }
> }
> Output is:
> String value: 5
> Number value: 5
> Class: class java.lang.Long
> Correct handling is implemented e.g. in BigDecimalValidator class of
> commons-validator package. It uses an additional method processParsedValue to
> convert number to the right type:
> /**
> * Convert the parsed value to a <code>BigDecimal</code>.
> *
> * @param value The parsed <code>Number</code> object created.
> * @param formatter The Format used to parse the value with.
> * @return The parsed <code>Number</code> converted to a
> * <code>BigDecimal</code>.
> */
> protected Object processParsedValue(Object value, Format formatter) {
> BigDecimal decimal = null;
> if (value instanceof Long) {
> decimal = BigDecimal.valueOf(((Long)value).longValue());
> } else {
> decimal = new BigDecimal(value.toString());
> }
> int scale = determineScale((NumberFormat)formatter);
> if (scale >= 0) {
> decimal = decimal.setScale(scale, BigDecimal.ROUND_DOWN);
> }
> return decimal;
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]