I personally can work with both approaches, but I prefer the pattern approach a bit more. The reason is that the pattern helps to understand how the numbers looks like without seeing the numbers itself. Also I guess it is more reasonable to let DecimalFormat handle the number rather than fixing the number manually.
A question for method B is then to use the decimal format symbols coming from the current locale and what happens if these chars don't match the chars used in the pattern. I guess a ParseException will be thrown? Thank you for your work so far. -----Ursprüngliche Nachricht----- Gesendet: Thursday, 21 August 2014 um 10:27:04 Uhr Von: "Charles Moulliard" <[email protected]> An: [email protected] Betreff: Re: Re: Camel Bindy: parse a BigDecimal number with a given pattern Here is what I suggest to implement in Camel Bindy --> https://www.dropbox.com/s/vlv3l3icwtowqs2/Screenshot%202014-08-21%2010.23.37.png?dl=0 There are 2 approaches, one using a Pattern and the other without the pattern. Until now, I don't know which one is the best and which one should be favoured ... On Thu, Aug 21, 2014 at 9:32 AM, Charles Moulliard <[email protected]> wrote: > For your information, the "pattern" is not relevant when we use > BigDecimalFormat or DoubleFormat. > My idea is to propose to add an attribute to specify the groupSeparator > and replace the separator by empty string "" > > Example: We get 123,456,999.00 --> we transform to 125456999.00 before to > create the BigDecimal > > Remark : I will have a look as we have also added an attribute > "impliedDecimalSeparator" which is used like that when we create the > BigDecimal. But I think that it is used for FixLength Format and a > different purpose > > BigDecimal result = new BigDecimal(string.trim()); > if (super.hasImpliedDecimalPosition()) { > result = result.divide(new BigDecimal(super.getMultiplier()), > super.getPrecision(), RoundingMode.HALF_EVEN); > } > > > > > On Thu, Aug 21, 2014 at 8:33 AM, Charles Moulliard <[email protected]> > wrote: > >> Hi, >> >> The AbstractNumberFormat class of Bindy used by Double & BigDecimal uses >> the property GroupingUsed(false) but there is no attribute defined with the >> @DataField annotation to manage group. Can you raise a ticket please so I >> will work on that tomorrow and rediscover the Bindy project that I created >> some years ago now ;-) ? >> >> public AbstractNumberFormat(boolean impliedDecimalPosition, int >> precision, Locale locale) { >> this.impliedDecimalPosition = impliedDecimalPosition; >> this.precision = precision > 0 ? precision : 0; >> this.format = null; >> this.multiplier = 1; >> >> this.format = new DecimalFormat(); >> this.format.setGroupingUsed(false); // SET TO FALSE >> >> Regards, >> >> >> >> >> On Wed, Aug 20, 2014 at 8:39 PM, <[email protected]> wrote: >> >>> The numbers I'd like to parse could have one the following structures: >>> 123,456,789.01 >>> 123.45 >>> -1234 >>> 1,234 >>> >>> (there are several rows in one file so it is possible that different >>> structures appear in a file) >>> >>> Setting the precision already works fine and the decimal separator is >>> treated correctly. >>> The current problem is that I can't tell bindy to ignore the comma sings >>> in every number, >>> because they are for grouping purposes and not needed in the BigDecimal >>> field. >>> >>> If I keep the comma sign in these numbers the parsing process will raise >>> a NumberFormatException >>> mentioning a malformed number. If I remove that comma signs in a test >>> file, everything works fine and the number >>> is mapped to the datafield correctly, but sadly that can't be a >>> solution, because this csv files are provided by >>> different system that cannot be changed. >>> >>> If I use the following annotation >>> @DataField(pos = 2, precision = 2, pattern = "#,###.##") >>> and use Double instead of BigDecimal I can keep the comma sings. But I >>> can't use Double for several reasons. >>> >>> The source code of the FormatFactory class (version 2.13.1) that I >>> linked in my question also shows that the pattern is used for Double types >>> (and several other types) but not for BigDecimal types. >>> >>> -----Ursprüngliche Nachricht----- >>> Gesendet: Wednesday, 20 August 2014 um 19:33:05 Uhr >>> Von: "Charles Moulliard" <[email protected]> >>> An: [email protected] >>> Betreff: Re: Camel Bindy: parse a BigDecimal number with a given pattern >>> The @DataField of Camel bindy proposes the parameter precision like also >>> a >>> pattern but not a grouping separator >>> >>> Example >>> >>> @DataField(pos = 2, precision = 2, pattern = "00.00") >>> private BigDecimal bigDecimal; >>> >>> Do you have an example to propose about such use case ? >>> >>> >>> On Wed, Aug 20, 2014 at 3:43 PM, <[email protected]> wrote: >>> >>> > Hello, >>> > >>> > I currently have a problem concerning Camel Bindy. I have a csv file >>> that >>> > should be parsed with Camel Bindy using a given model class. This csv >>> file >>> > contains a number that should be parsed as a BigDecimal. The problem is >>> > that >>> > this number contains a comma as a grouping separator and a point as the >>> > decimal separator. >>> > If I start the camel route the unmarshal process will throw a >>> > NumberFormatException mentioning the invalid format of that number. So >>> I >>> > tried to add a pattern to the DataField annotation, but the error >>> stays. >>> > >>> > After digging throw the documentation ( >>> http://camel.apache.org/bindy.html) >>> > and the source code of FormatFactory >>> > ( >>> > >>> http://grepcode.com/file_/repo1.maven.org/maven2/org.apache.camel/camel-bindy/2.13.1/org/apache/camel/dataformat/bindy/FormatFactory.java/?v=source >>> > ) >>> > I'm a little bit confused, because the documentation mentions the >>> ability >>> > to >>> > specify a grouping separator, but the source code shows that the >>> pattern is >>> > ignored for BigDecimal data types. >>> > >>> > Does anyone know how to specify that grouping separator? Or is this not >>> > implemented yet? >>> > >>> > Many thanks in advance. >>> > >>> > Best regards. >>> > Tom >>> > >>> > P.S. I also posted that question on stackoverflow >>> > ( >>> > >>> http://stackoverflow.com/questions/25381052/camel-bindy-add-pattern-for-bigdecimal-type >>> > ), >>> > but with no luck yet. >>> > >>> > P.P.S. I posted that question using nabble.com ( >>> > http://camel.465427.n5.nabble.com/Camel-Users-f465428.html) some >>> moments >>> > ago, but it seems that there is a problem with my mail provider that >>> > doesn't allow services like this. So I'm sending this question directly >>> > now. Sorry for any inconveniences. >>> > >>> >>> >>> >>> -- >>> Charles Moulliard >>> Apache Committer / Architect @RedHat >>> Twitter : @cmoulliard | Blog : http://cmoulliard.github.io >>> >> >> >> >> -- >> Charles Moulliard >> Apache Committer / Architect @RedHat >> Twitter : @cmoulliard | Blog : http://cmoulliard.github.io >> >> > > > -- > Charles Moulliard > Apache Committer / Architect @RedHat > Twitter : @cmoulliard | Blog : http://cmoulliard.github.io > > -- Charles Moulliard Apache Committer / Architect @RedHat Twitter : @cmoulliard | Blog : http://cmoulliard.github.io
