]> source.dussan.org Git - poi.git/commitdiff
Add a new method on HSSFDateUtil of isADateFormat, which will cope with both internal...
authorNick Burch <nick@apache.org>
Sun, 17 Jun 2007 15:27:23 +0000 (15:27 +0000)
committerNick Burch <nick@apache.org>
Sun, 17 Jun 2007 15:27:23 +0000 (15:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@548044 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFDateUtil.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java

index 3a1a8f09beb3d2a2034098eee2306aef02a0f9aa..a12f12623f30ec1096f4ffa4e99d4c2c3da80e29 100644 (file)
@@ -148,10 +148,46 @@ public class HSSFDateUtil
             return null;
         }
     }
+    
+    /**
+     * Given a format ID and its format String, will check to see if the
+     *  format represents a date format or not.
+     * Firstly, it will check to see if the format ID corresponds to an
+     *  internal excel date format (eg most US date formats) 
+     * If not, it will check to see if the format string only contains
+     *  date formatting characters (ymd-/), which covers most
+     *  non US date formats.
+     *  
+     * @param formatIndex The index of the format, eg from ExtendedFormatRecord.getFormatIndex
+     * @param formatString The format string
+     */
+    public static boolean isADateFormat(int formatIndex, String formatString) {
+       // First up, is this an internal date format?
+       if(isInternalDateFormat(formatIndex)) {
+               return true;
+       }
+       
+       // If we didn't get a real string, it can't be
+       if(formatString == null || formatString.length() == 0) {
+               return false;
+       }
+       
+       // Translate \- into just -, before matching
+       String fs = formatString.replace("\\-","-"); 
+       
+       // Otherwise, check it's only made up of:
+       //  y m d - /
+       if(fs.matches("^[ymd\\-/]+$")) {
+               return true;
+       }
+       
+       return false;
+    }
 
     /**
-     * given a format ID this will check whether the format represents
-     * an internal date format or not. 
+     * Given a format ID this will check whether the format represents
+     *  an internal excel date format or not.
+     * @see isDateFormat(int,String) 
      */
     public static boolean isInternalDateFormat(int format) {
       boolean retval =false;
index 01539f09393031eac613f88b1cff3e1090f20f56..ddf20fd774aa6c98bcf2742c62702e202cd36379 100644 (file)
@@ -182,6 +182,56 @@ public class TestHSSFDateUtil
                     HSSFDateUtil.getExcelDate(javaDate), oneMinute);
         }
     }
+    
+    /**
+     * Tests that we correctly detect date formats as such
+     */
+    public void testIdentifyDateFormats() {
+       // First up, try with a few built in date formats
+       short[] builtins = new short[] { 0x0e, 0x0f, 0x10, 0x16, 0x2d, 0x2e };
+       for(int i=0; i<builtins.length; i++) {
+               String formatStr = HSSFDataFormat.getBuiltinFormat(builtins[i]);
+               assertTrue( HSSFDateUtil.isInternalDateFormat(builtins[i]) );
+               assertTrue( HSSFDateUtil.isADateFormat(builtins[i],formatStr) );
+       }
+       
+       // Now try a few built-in non date formats
+       builtins = new short[] { 0x01, 0x02, 0x17, 0x1f, 0x30 };
+       for(int i=0; i<builtins.length; i++) {
+               String formatStr = HSSFDataFormat.getBuiltinFormat(builtins[i]);
+               assertFalse( HSSFDateUtil.isInternalDateFormat(builtins[i]) );
+               assertFalse( HSSFDateUtil.isADateFormat(builtins[i],formatStr) );
+       }
+       
+       // Now for some non-internal ones
+       // These come after the real ones
+       int numBuiltins = HSSFDataFormat.getNumberOfBuiltinBuiltinFormats();
+       assertTrue(numBuiltins < 60);
+       short formatId = 60;
+       assertFalse( HSSFDateUtil.isInternalDateFormat(formatId) );
+       
+       // Valid ones first
+       String[] formats = new String[] {
+                       "yyyy-mm-dd", "yyyy/mm/dd", "yy/mm/dd", "yy/mmm/dd",
+                       "dd/mm/yy", "dd/mm/yyyy", "dd/mmm/yy",
+                       "dd-mm-yy", "dd-mm-yyyy",
+                       "dd\\-mm\\-yy", // Sometimes escaped
+       };
+       for(int i=0; i<formats.length; i++) {
+               assertTrue( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+       }
+       
+       // Then invalid ones
+       formats = new String[] {
+                       "yyyy:mm:dd", 
+                       "0.0", "0.000",
+                       "0%", "0.0%",
+                       "", null
+       };
+       for(int i=0; i<formats.length; i++) {
+               assertFalse( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+       }
+    }
 
     public static void main(String [] args) {
         System.out