commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Niall Pemberton (JIRA)" <j...@apache.org>
Subject [jira] Resolved: (BEANUTILS-282) BigDecimalLocaleConverter returns Long object
Date Wed, 27 Jun 2007 19:31:26 GMT

     [ 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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message