You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2015/11/04 19:23:17 UTC

svn commit: r1712605 - in /poi/trunk/src: java/org/apache/poi/ss/usermodel/DataFormatter.java testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java

Author: nick
Date: Wed Nov  4 18:23:17 2015
New Revision: 1712605

URL: http://svn.apache.org/viewvc?rev=1712605&view=rev
Log:
Bug #55265 - DataFormatter correct support for alternate number grouping characters, eg 1234 + #'##0 = 1'234 not 1,234

Modified:
    poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
    poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java?rev=1712605&r1=1712604&r2=1712605&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java Wed Nov  4 18:23:17 2015
@@ -158,6 +158,12 @@ public class DataFormatter implements Ob
     private static final Pattern fractionStripper = Pattern.compile("(\"[^\"]*\")|([^ \\?#\\d\\/]+)");
 
     /**
+     * A regex to detect if an alternate grouping character is used
+     *  in a numeric format 
+     */
+    private static final Pattern alternateGrouping = Pattern.compile("([#0]([^.#0])[#0]{3})");
+    
+    /**
       * Cells formatted with a date or time format and which contain invalid date or time values
      *  show 255 pound signs ("#").
       */
@@ -658,10 +664,24 @@ public class DataFormatter implements Ob
     }
 
     private Format createNumberFormat(String formatStr, double cellValue) {
-        final String format = cleanFormatForNumber(formatStr);
+        String format = cleanFormatForNumber(formatStr);
+        DecimalFormatSymbols symbols = decimalSymbols;
+        
+        // Do we need to change the grouping character?
+        // eg for a format like #'##0 which wants 12'345 not 12,345
+        Matcher agm = alternateGrouping.matcher(format);
+        if (agm.find()) {
+            symbols = DecimalFormatSymbols.getInstance(locale);
+            
+            char grouping = agm.group(2).charAt(0);
+            symbols.setGroupingSeparator(grouping);
+            String oldPart = agm.group(1);
+            String newPart = oldPart.replace(grouping, ',');
+            format = format.replace(oldPart, newPart);
+        }
         
         try {
-            DecimalFormat df = new DecimalFormat(format, decimalSymbols);
+            DecimalFormat df = new DecimalFormat(format, symbols);
             setExcelStyleRoundingMode(df);
             return df;
         } catch(IllegalArgumentException iae) {

Modified: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java?rev=1712605&r1=1712604&r2=1712605&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestDataFormat.java Wed Nov  4 18:23:17 2015
@@ -165,4 +165,40 @@ public abstract class BaseTestDataFormat
         // TODO Fix this to not have an extra 0 at the end
         //assertEquals(pound+"   -  ", formatter.formatCellValue(zero)); 
     }
+    
+    /**
+     * Using a single quote (') instead of a comma (,) as
+     *  a number separator, eg 1000 -> 1'000 
+     */
+    public final void test55265() {
+        Workbook wb = _testDataProvider.createWorkbook();
+        DataFormatter formatter = new DataFormatter();
+        DataFormat fmt = wb.createDataFormat();
+        Sheet sheet = wb.createSheet();
+        Row r = sheet.createRow(0);
+        
+        CellStyle cs = wb.createCellStyle();
+        cs.setDataFormat(fmt.getFormat("#'##0"));
+        
+        Cell zero = r.createCell(0);
+        zero.setCellValue(0);
+        zero.setCellStyle(cs);
+        
+        Cell sml = r.createCell(1);
+        sml.setCellValue(12);
+        sml.setCellStyle(cs);
+        
+        Cell med = r.createCell(2);
+        med.setCellValue(1234);
+        med.setCellStyle(cs);
+        
+        Cell lge = r.createCell(3);
+        lge.setCellValue(12345678);
+        lge.setCellStyle(cs);
+        
+        assertEquals("0", formatter.formatCellValue(zero)); 
+        assertEquals("12", formatter.formatCellValue(sml)); 
+        assertEquals("1'234", formatter.formatCellValue(med)); 
+        assertEquals("12'345'678", formatter.formatCellValue(lge)); 
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org