Daniel Schneller created JBEHAVE-739:
----------------------------------------

             Summary: NumberFormatException when trying to convert parameters 
to BigDecimal with Locale
                 Key: JBEHAVE-739
                 URL: https://jira.codehaus.org/browse/JBEHAVE-739
             Project: JBehave
          Issue Type: Bug
          Components: Core
    Affects Versions: 3.6
            Reporter: Daniel Schneller


When using a German localized number with group separators and decimals, a 
conversion to BigDecimal fails with a {{NumberFormatException}}. For German, 
group separators are dots, decimal separator is a comma (just the other way 
round of the US version). 

In the following test class, the first case is green, the second fails with

{noformat}
org.jbehave.core.steps.ParameterConverters$ParameterConvertionFailed: 
1.000.000,01
        at 
org.jbehave.core.steps.ParameterConverters$NumberConverter.convertValue(ParameterConverters.java:256)
        at 
de.westlb.jets.xce.jbehave.tools.NumberFormatTest.jbehaveConverter(NumberFormatTest.java:39)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at 
org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
        ...
        at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NumberFormatException
        at java.math.BigDecimal.<init>(BigDecimal.java:453)
        at java.math.BigDecimal.<init>(BigDecimal.java:728)
        at 
org.jbehave.core.steps.ParameterConverters$NumberConverter.convertValue(ParameterConverters.java:247)
        ... 21 more
{noformat}

Putting a breakpoint in the BigDecimal constructor reveals it is fed a String 
"1.000.000.000.00" which is obviously wrong. I suspect, the "canonicalization" 
of the original String breaks it.

{code:title=Test.java}
public class NumberFormatTest {

        private static final BigDecimal EXPECTED = new BigDecimal("1000000.01");
        private final String localizedString = "1.000.000,01";
        private DecimalFormat germanNumbers;

        @Before
        public void setup() {
                germanNumbers = (DecimalFormat) DecimalFormat
                                .getNumberInstance(Locale.GERMAN);
                germanNumbers.setParseBigDecimal(true);

        }

        @Test
        public void plainConverter() throws Exception {
                Number parse = germanNumbers.parse(localizedString);
                assertEquals(EXPECTED, parse);
        }

        @Test
        public void jbehaveConverter() throws Exception {
                ParameterConverters.NumberConverter numberConverter = new 
ParameterConverters.NumberConverter(
                                germanNumbers);
                Object v = numberConverter.convertValue(localizedString,
                                BigDecimal.class);
                assertEquals(EXPECTED, v);

        }
{code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to