You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2014/08/26 10:34:21 UTC

git commit: CAMEL-7742: Add rounding, decimal, grouping attributes for @DateField, add unit tests

Repository: camel
Updated Branches:
  refs/heads/master e1f9e26e6 -> 2854e18ff


CAMEL-7742: Add rounding, decimal, grouping attributes for @DateField, add unit tests


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/2854e18f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2854e18f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2854e18f

Branch: refs/heads/master
Commit: 2854e18ff985ffb9abaca305038801f6c508f0c4
Parents: e1f9e26
Author: Charles Moulliard <ch...@gmail.com>
Authored: Tue Aug 26 10:34:12 2014 +0200
Committer: Charles Moulliard <ch...@gmail.com>
Committed: Tue Aug 26 10:34:12 2014 +0200

----------------------------------------------------------------------
 .../camel/dataformat/bindy/FormatFactory.java   |  38 +++----
 .../dataformat/bindy/annotation/DataField.java  |  21 ++++
 .../bindy/format/BigDecimalPatternFormat.java   |  34 ++++++
 .../bindy/format/NumberPatternFormat.java       |  52 ++++++++-
 .../bindy/number/BindyFormatUnmarshallTest.java | 105 -------------------
 .../BindyBigDecimalGroupingUnmarshallTest.java  |  93 ++++++++++++++++
 .../BindyBigDecimalRoundingUnmarshallTest.java  |  89 ++++++++++++++++
 7 files changed, 303 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
index d5dc68b..794aace 100755
--- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/FormatFactory.java
@@ -24,25 +24,7 @@ import java.util.Locale;
 
 import org.apache.camel.dataformat.bindy.annotation.DataField;
 import org.apache.camel.dataformat.bindy.annotation.KeyValuePairField;
-import org.apache.camel.dataformat.bindy.format.BigDecimalFormat;
-import org.apache.camel.dataformat.bindy.format.BigIntegerFormat;
-import org.apache.camel.dataformat.bindy.format.BooleanFormat;
-import org.apache.camel.dataformat.bindy.format.ByteFormat;
-import org.apache.camel.dataformat.bindy.format.BytePatternFormat;
-import org.apache.camel.dataformat.bindy.format.CharacterFormat;
-import org.apache.camel.dataformat.bindy.format.DatePatternFormat;
-import org.apache.camel.dataformat.bindy.format.DoubleFormat;
-import org.apache.camel.dataformat.bindy.format.DoublePatternFormat;
-import org.apache.camel.dataformat.bindy.format.EnumFormat;
-import org.apache.camel.dataformat.bindy.format.FloatFormat;
-import org.apache.camel.dataformat.bindy.format.FloatPatternFormat;
-import org.apache.camel.dataformat.bindy.format.IntegerFormat;
-import org.apache.camel.dataformat.bindy.format.IntegerPatternFormat;
-import org.apache.camel.dataformat.bindy.format.LongFormat;
-import org.apache.camel.dataformat.bindy.format.LongPatternFormat;
-import org.apache.camel.dataformat.bindy.format.ShortFormat;
-import org.apache.camel.dataformat.bindy.format.ShortPatternFormat;
-import org.apache.camel.dataformat.bindy.format.StringFormat;
+import org.apache.camel.dataformat.bindy.format.*;
 import org.apache.camel.util.ObjectHelper;
 
 
@@ -61,13 +43,17 @@ public final class FormatFactory {
      * @param pattern is the pattern to be used during the formatting of the data
      * @param locale optional locale for NumberFormat and DateFormat parsing.
      * @param precision optional scale for BigDecimal parsing.
+     * @param rounding optional rounding mode to be used to scale BigDecimal with precision value
      * @param impliedDecimalSeparator optional flag for floating-point values
+     * @param decimalSeparator optional decimal separator for BigDecimal
+     * @param groupingSeparator optional grouping separator for BigDecimal
      * @return Format the formatter
      * @throws IllegalArgumentException if not suitable formatter is found
      */
     @SuppressWarnings("unchecked")
     private static Format<?> doGetFormat(Class<?> clazz, String pattern, String locale,
-                                         String timezone, int precision, boolean impliedDecimalSeparator)
+                                         String timezone, int precision, String rounding,
+                                         boolean impliedDecimalSeparator, String decimalSeparator, String groupingSeparator)
         throws Exception {
         if (clazz == byte.class || clazz == Byte.class) {
             return ObjectHelper.isNotEmpty(pattern)
@@ -94,7 +80,9 @@ public final class FormatFactory {
                 ? new DoublePatternFormat(pattern, getLocale(locale))
                 : new DoubleFormat(impliedDecimalSeparator, precision, getLocale(locale));
         } else if (clazz == BigDecimal.class) {
-            return new BigDecimalFormat(impliedDecimalSeparator, precision, getLocale(locale));
+            return ObjectHelper.isNotEmpty(pattern)
+                ? new BigDecimalPatternFormat(pattern, getLocale(locale), precision, rounding, decimalSeparator, groupingSeparator)
+                : new BigDecimalFormat(impliedDecimalSeparator, precision, getLocale(locale));
         } else if (clazz == BigInteger.class) {
             return new BigIntegerFormat();
         } else if (clazz == String.class) {
@@ -124,8 +112,11 @@ public final class FormatFactory {
         String pattern = data.pattern();
         String timezone = data.timezone();
         int precision = data.precision();
+        String decimalSeparator = data.decimalSeparator();
+        String groupingSeparator = data.groupingSeparator();
+        String rounding = data.rounding();
 
-        return doGetFormat(clazz, pattern, locale, timezone, precision, data.impliedDecimalSeparator());
+        return doGetFormat(clazz, pattern, locale, timezone, precision, rounding, data.impliedDecimalSeparator(), decimalSeparator, groupingSeparator);
     }
 
     /**
@@ -135,13 +126,14 @@ public final class FormatFactory {
      * @param locale optional locale for NumberFormat and DateFormat parsing.
      * @return Format the formatter
      * @throws IllegalArgumentException if not suitable formatter is found
+     * TODO : Check if KeyValuePair could also use decimal/groupingSeparator/rounding for BigDecimal
      */
     public static Format<?> getFormat(Class<?> clazz, String locale, KeyValuePairField data) throws Exception {
         String pattern = data.pattern();
         String timezone = data.timezone();
         int precision = data.precision();
 
-        return doGetFormat(clazz, pattern, locale, timezone, precision, data.impliedDecimalSeparator());
+        return doGetFormat(clazz, pattern, locale, timezone, precision, null, data.impliedDecimalSeparator(), null, null);
     }
 
     private static Locale getLocale(String locale) {

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java
index cacbb52..cec86c8 100755
--- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java
@@ -123,4 +123,25 @@ public @interface DataField {
      * Indicates if there is a decimal point implied at a specified location
      */
     boolean impliedDecimalSeparator() default false;
+
+    /**
+     * Decimal Separator to be used with BigDecimal number
+     */
+    String decimalSeparator() default "";
+
+    /**
+     * Grouping Separator to be used with BigDecimal number
+     * when we would like to format/parse to number with grouping
+     * e.g. 123,456.789
+     */
+    String groupingSeparator() default "";
+
+    /**
+     * Round mode to be used to round/scale a BigDecimal
+     * Values : UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN,HALF_EVEN, UNNECESSARY
+     * e.g : Number = 123456.789, Precision = 2, Rounding =  CEILING
+     * Result : 123456.79
+     */
+     String rounding() default "CEILING";
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/BigDecimalPatternFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/BigDecimalPatternFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/BigDecimalPatternFormat.java
new file mode 100644
index 0000000..ae1200d
--- /dev/null
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/BigDecimalPatternFormat.java
@@ -0,0 +1,34 @@
+package org.apache.camel.dataformat.bindy.format;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+public class BigDecimalPatternFormat extends NumberPatternFormat<BigDecimal> {
+
+    public void BigDecimalPatternFormat() {
+    }
+
+    public BigDecimalPatternFormat(String pattern, Locale locale, int precision, String rounding, String decimalSeparator, String groupingSeparator) {
+        super(pattern, locale, precision, rounding, decimalSeparator, groupingSeparator);
+    }
+
+    @Override
+    public BigDecimal parse(String string) throws Exception {
+        if (getNumberFormat() != null) {
+            Locale.setDefault(super.getLocale());
+            DecimalFormat df = (DecimalFormat)getNumberFormat();
+            df.setParseBigDecimal(true);
+            BigDecimal bd = (BigDecimal)df.parse(string.trim());
+            if(super.getPrecision() != -1) {
+                bd = bd.setScale(super.getPrecision(), RoundingMode.valueOf(super.getRounding()));
+            }
+            Locale.getDefault();
+            return bd;
+        } else {
+            return new BigDecimal(string.trim());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/NumberPatternFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/NumberPatternFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/NumberPatternFormat.java
index 5e17e96..5cfe146 100755
--- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/NumberPatternFormat.java
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/format/NumberPatternFormat.java
@@ -17,6 +17,7 @@
 package org.apache.camel.dataformat.bindy.format;
 
 import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
 import java.text.NumberFormat;
 import java.util.Locale;
 
@@ -26,6 +27,10 @@ public abstract class NumberPatternFormat<T> implements PatternFormat<T> {
 
     private String pattern;
     private Locale locale;
+    private String decimalSeparator;
+    private String groupingSeparator;
+    private int precision;
+    private String rounding;
 
     public NumberPatternFormat() {
     }
@@ -35,6 +40,15 @@ public abstract class NumberPatternFormat<T> implements PatternFormat<T> {
         this.locale = locale;
     }
 
+    public NumberPatternFormat(String pattern, Locale locale, int precision, String rounding, String decimalSeparator, String groupingSeparator) {
+        this.pattern = pattern;
+        this.locale = locale;
+        this.decimalSeparator = decimalSeparator;
+        this.groupingSeparator = groupingSeparator;
+        this.precision = precision;
+        this.rounding = rounding;
+    }
+
     public String format(T object) throws Exception {
         if (getNumberFormat() != null) {
             return this.getNumberFormat().format(object);
@@ -57,7 +71,18 @@ public abstract class NumberPatternFormat<T> implements PatternFormat<T> {
 
         NumberFormat format = NumberFormat.getNumberInstance(locale);
         if (format instanceof DecimalFormat) {
-            ((DecimalFormat)format).applyLocalizedPattern(pattern);
+            DecimalFormat df = (DecimalFormat) format;
+            if (decimalSeparator != null && groupingSeparator != null) {
+                if (!decimalSeparator.isEmpty() && !groupingSeparator.isEmpty()) {
+                    DecimalFormatSymbols dfs = new DecimalFormatSymbols(locale);
+                    dfs.setDecimalSeparator(decimalSeparator.charAt(0));
+                    dfs.setGroupingSeparator(groupingSeparator.charAt(0));
+                    df.setDecimalFormatSymbols(dfs);
+                }
+            }
+            if (!pattern.isEmpty()) {
+                df.applyPattern(pattern);
+            }
         }
         return format;
     }
@@ -69,4 +94,29 @@ public abstract class NumberPatternFormat<T> implements PatternFormat<T> {
     public void setPattern(String pattern) {
         this.pattern = pattern;
     }
+
+    public int getPrecision() {
+        return precision;
+    }
+
+    public void setPrecision(int precision) {
+        this.precision = precision;
+    }
+
+    public String getRounding() {
+        return rounding;
+    }
+
+    public void setRounding(String rounding) {
+        this.rounding = rounding;
+    }
+
+    public Locale getLocale() {
+        return locale;
+    }
+
+    public void setLocale(Locale locale) {
+        this.locale = locale;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/BindyFormatUnmarshallTest.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/BindyFormatUnmarshallTest.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/BindyFormatUnmarshallTest.java
deleted file mode 100644
index 6341041..0000000
--- a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/BindyFormatUnmarshallTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.apache.camel.dataformat.bindy.number;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.Produce;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
-import org.apache.camel.dataformat.bindy.annotation.DataField;
-import org.apache.camel.model.dataformat.BindyDataFormat;
-import org.apache.camel.model.dataformat.BindyType;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Assert;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-public class BindyFormatUnmarshallTest extends CamelTestSupport {
-
-    private static final Logger LOG = LoggerFactory.getLogger(BindyFormatUnmarshallTest.class);
-
-    private static final String URI_MOCK_RESULT = "mock:result";
-    private static final String URI_DIRECT_START = "direct:start";
-
-    @Produce(uri = URI_DIRECT_START)
-    private ProducerTemplate template;
-
-    @EndpointInject(uri = URI_MOCK_RESULT)
-    private MockEndpoint result;
-
-    private String record;
-
-    @Test
-    public void testInteger() throws Exception {
-
-        record = "10000,25.12";
-        String intVal = "10000";
-        String bigDecimal = "25.12";
-
-        template.sendBody(record);
-
-        result.expectedMessageCount(1);
-        result.assertIsSatisfied();
-
-        Math math = (Math)result.getExchanges().get(0).getIn().getBody();
-        Assert.assertEquals(math.getIntAmount().toString(),intVal);
-        Assert.assertEquals(math.getBigDecimal().toString(),bigDecimal);
-
-        LOG.info("Math object received : " + math);
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                BindyDataFormat bindy = new BindyDataFormat();
-                bindy.setType(BindyType.Csv);
-                bindy.setClassType(BindyFormatUnmarshallTest.Math.class);
-
-                from(URI_DIRECT_START)
-                   .unmarshal(bindy)
-                   .to(URI_MOCK_RESULT);
-            }
-
-        };
-    }
-
-    @CsvRecord(separator = ",")
-    public static class Math {
-
-        @DataField(pos = 1, pattern = "00")
-        private Integer intAmount;
-
-        @DataField(pos = 2, precision = 2)
-        private BigDecimal bigDecimal;
-
-        public Integer getIntAmount() {
-            return intAmount;
-        }
-
-        public void setIntAmount(Integer intAmount) {
-            this.intAmount = intAmount;
-        }
-
-        public BigDecimal getBigDecimal() {
-            return bigDecimal;
-        }
-
-        public void setBigDecimal(BigDecimal bigDecimal) {
-            this.bigDecimal = bigDecimal;
-        }
-
-        @Override
-        public String toString() {
-            return "intAmount : " + this.intAmount + ", " +
-                   "bigDecimal : " + this.bigDecimal;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/grouping/BindyBigDecimalGroupingUnmarshallTest.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/grouping/BindyBigDecimalGroupingUnmarshallTest.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/grouping/BindyBigDecimalGroupingUnmarshallTest.java
new file mode 100644
index 0000000..714c678
--- /dev/null
+++ b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/grouping/BindyBigDecimalGroupingUnmarshallTest.java
@@ -0,0 +1,93 @@
+package org.apache.camel.dataformat.bindy.number.grouping;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
+import org.apache.camel.dataformat.bindy.annotation.DataField;
+import org.apache.camel.model.dataformat.BindyDataFormat;
+import org.apache.camel.model.dataformat.BindyType;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+
+public class BindyBigDecimalGroupingUnmarshallTest extends CamelTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(BindyBigDecimalGroupingUnmarshallTest.class);
+
+    private static final String URI_MOCK_RESULT = "mock:result";
+    private static final String URI_DIRECT_START = "direct:start";
+
+    @Produce(uri = URI_DIRECT_START)
+    private ProducerTemplate template;
+
+    @EndpointInject(uri = URI_MOCK_RESULT)
+    private MockEndpoint result;
+
+    private String record;
+
+    @Test
+    public void testBigDecimalPattern() throws Exception {
+
+        record = "'123.456,234'";
+        String bigDecimal = "123456.24";
+
+        template.sendBody(record);
+
+        result.expectedMessageCount(1);
+        result.assertIsSatisfied();
+
+        NumberModel bd = (NumberModel)result.getExchanges().get(0).getIn().getBody();
+        Assert.assertEquals(bigDecimal, bd.getGrouping().toString());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                BindyDataFormat bindy = new BindyDataFormat();
+                bindy.setType(BindyType.Csv);
+                bindy.setClassType(NumberModel.class);
+                bindy.setLocale("en");
+
+                from(URI_DIRECT_START)
+                   .unmarshal(bindy)
+                   .to(URI_MOCK_RESULT);
+            }
+
+        };
+    }
+
+    @CsvRecord(separator = ",", quote = "'")
+    public static class NumberModel {
+
+        @DataField(pos = 1, precision = 2,
+                rounding = "CEILING",
+                pattern = "###,###.###",
+                decimalSeparator = ",",
+                groupingSeparator = ".")
+        private BigDecimal grouping;
+
+        public BigDecimal getGrouping() {
+            return grouping;
+        }
+
+        public void setGrouping(BigDecimal grouping) {
+            this.grouping = grouping;
+        }
+
+
+        @Override
+        public String toString() {
+            return "bigDecimal grouping : " + this.grouping;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2854e18f/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/rounding/BindyBigDecimalRoundingUnmarshallTest.java
----------------------------------------------------------------------
diff --git a/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/rounding/BindyBigDecimalRoundingUnmarshallTest.java b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/rounding/BindyBigDecimalRoundingUnmarshallTest.java
new file mode 100644
index 0000000..ba7262b
--- /dev/null
+++ b/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/number/rounding/BindyBigDecimalRoundingUnmarshallTest.java
@@ -0,0 +1,89 @@
+package org.apache.camel.dataformat.bindy.number.rounding;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
+import org.apache.camel.dataformat.bindy.annotation.DataField;
+import org.apache.camel.model.dataformat.BindyDataFormat;
+import org.apache.camel.model.dataformat.BindyType;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+
+public class BindyBigDecimalRoundingUnmarshallTest extends CamelTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(BindyBigDecimalRoundingUnmarshallTest.class);
+
+    private static final String URI_MOCK_RESULT = "mock:result";
+    private static final String URI_DIRECT_START = "direct:start";
+
+    @Produce(uri = URI_DIRECT_START)
+    private ProducerTemplate template;
+
+    @EndpointInject(uri = URI_MOCK_RESULT)
+    private MockEndpoint result;
+
+    private String record;
+
+
+    @Test
+    public void testBigDecimalRoundingUp() throws Exception {
+
+        record = "'12345.789'";
+        String bigDecimal = "12345.79";
+
+        template.sendBody(record);
+
+        result.expectedMessageCount(1);
+        result.assertIsSatisfied();
+
+        NumberModel bd = (NumberModel)result.getExchanges().get(0).getIn().getBody();
+        Assert.assertEquals(bigDecimal,bd.getRoundingUp().toString());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                BindyDataFormat bindy = new BindyDataFormat();
+                bindy.setType(BindyType.Csv);
+                bindy.setClassType(NumberModel.class);
+                bindy.setLocale("en");
+
+                from(URI_DIRECT_START)
+                   .unmarshal(bindy)
+                   .to(URI_MOCK_RESULT);
+            }
+
+        };
+    }
+
+    @CsvRecord(separator = ",", quote = "'")
+    public static class NumberModel {
+
+        @DataField(pos = 1, precision = 2, rounding = "UP", pattern = "#####,##")
+        private BigDecimal roundingUp;
+
+        public BigDecimal getRoundingUp() {
+            return roundingUp;
+        }
+
+        public void setRoundingUp(BigDecimal roundingUp) {
+            this.roundingUp = roundingUp;
+        }
+
+        @Override
+        public String toString() {
+            return "BigDecimal rounding : " + this.roundingUp;
+        }
+    }
+}