Author: centic
Date: Sat Jan 11 09:23:55 2025
New Revision: 1923056

URL: http://svn.apache.org/viewvc?rev=1923056&view=rev
Log:
Bug 65190: Handle decimal format '0#' the same way as Excel

Modified:
    poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java
    
poi/trunk/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java?rev=1923056&r1=1923055&r2=1923056&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java 
(original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java 
Sat Jan 11 09:23:55 2025
@@ -163,6 +163,11 @@ public class DataFormatter {
     private static final Pattern alternateGrouping = 
Pattern.compile("([#0]([^.#0])[#0]{3})");
 
     /**
+     * For handling '0#' properly
+     */
+    private static final Pattern decimalFormatFix = Pattern.compile("0+#");
+
+    /**
       * Cells formatted with a date or time format and which contain invalid 
date or time values
      *  show 255 pound signs ("#").
       */
@@ -850,6 +855,11 @@ public class DataFormatter {
             }
         }
 
+        // Excel ignores leading zeros, but Java fails with an exception below
+        if (decimalFormatFix.matcher(format).matches()) {
+            format = "#";
+        }
+
         try {
             return new InternalDecimalFormatWithScale(format, symbols);
         } catch(IllegalArgumentException iae) {

Modified: 
poi/trunk/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java?rev=1923056&r1=1923055&r2=1923056&view=diff
==============================================================================
--- 
poi/trunk/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java 
(original)
+++ 
poi/trunk/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java 
Sat Jan 11 09:23:55 2025
@@ -1207,4 +1207,27 @@ class TestDataFormatter {
             assertEquals("25571.751069247686", df.formatCellValue(cell));*/
         }
     }
+
+    @Test
+    void testBug65190() {
+        DataFormatter formatter = new DataFormatter(Locale.ENGLISH);
+
+        assertEquals("12334567890",
+                formatter.formatRawCellContents(12334567890.0, 0, "0"));
+        assertEquals("12334567890",
+                formatter.formatRawCellContents(12334567890.0, 0, "#"));
+        assertEquals("12334567890",
+                formatter.formatRawCellContents(12334567890.0, 0, "#0"));
+        assertEquals("12334567890",
+                formatter.formatRawCellContents(12334567890.0, 0, "0#"));
+
+        assertEquals("12334567890123",
+                formatter.formatRawCellContents(12334567890123.0, 0, "0"));
+        assertEquals("12334567890123",
+                formatter.formatRawCellContents(12334567890123.0, 0, "#"));
+        assertEquals("12334567890123",
+                formatter.formatRawCellContents(12334567890123.0, 0, "#0"));
+        assertEquals("12334567890123",
+                formatter.formatRawCellContents(12334567890123.0, 0, "0#"));
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to