From f0ca7d289974c4a59b157a66e4db56386648f77d Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Wed, 13 Feb 2013 16:45:03 +0000 Subject: [PATCH] Fix bug #54557 - Don't mis-detect format patterns like .000 as dates git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1445725 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/ss/usermodel/DateUtil.java | 15 +++++++++++---- .../poi/hssf/usermodel/TestHSSFDateUtil.java | 11 ++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/poi/ss/usermodel/DateUtil.java b/src/java/org/apache/poi/ss/usermodel/DateUtil.java index 12e862d4d1..2a32e47210 100644 --- a/src/java/org/apache/poi/ss/usermodel/DateUtil.java +++ b/src/java/org/apache/poi/ss/usermodel/DateUtil.java @@ -55,7 +55,8 @@ public class DateUtil { */ private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]"); private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z]+\\]"); - private static final Pattern date_ptrn3 = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-/,. :\"\\\\]+0*[ampAMP/]*$"); + private static final Pattern date_ptrn3a = Pattern.compile("[yYmMdDhHsS]"); + private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-/,. :\"\\\\]+0*[ampAMP/]*$"); // elapsed time patterns: [h],[m] and [s] private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]"); @@ -364,10 +365,16 @@ public class DateUtil { fs = fs.substring(0, fs.indexOf(';')); } - // Otherwise, check it's only made up, in any case, of: - // y m d h s - \ / , . : + // Ensure it has some date letters in it + // (Avoids false positives on the rest of pattern 3) + if (! date_ptrn3a.matcher(fs).find()) { + return false; + } + + // If we get here, check it's only made up, in any case, of: + // y m d h s - \ / , . : [ ] // optionally followed by AM/PM - return date_ptrn3.matcher(fs).matches(); + return date_ptrn3b.matcher(fs).matches(); } /** diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java index 32f3fe65f9..6733f73fa2 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java @@ -499,5 +499,14 @@ public final class TestHSSFDateUtil extends TestCase { assertEquals(valueToTest.getTime(), returnedValue.getTime()); } - + /** + * DateUtil.isCellFormatted(Cell) should not true for a numeric cell + * that's formatted as ".0000" + */ + public void testBug54557() throws Exception { + final String format = ".0000"; + boolean isDateFormat = HSSFDateUtil.isADateFormat(165, format); + + assertEquals(false, isDateFormat); + } } -- 2.39.5