diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java b/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java index 95b0243bce..bfe795025e 100644 --- a/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java +++ b/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java @@ -162,6 +162,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) { diff --git a/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java b/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java index cf6c2c7e9d..0d49bee3ab 100644 --- a/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java +++ b/poi/src/test/java/org/apache/poi/ss/usermodel/TestDataFormatter.java @@ -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#")); + } }