[ 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]