Add a new method on HSSFDateUtil of isADateFormat, which will cope with both internal excel date formats, and custom date formats the are for dates (plus test)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@548044 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8dc3f008cf
commit
565528df7d
@ -150,8 +150,44 @@ public class HSSFDateUtil
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* given a format ID this will check whether the format represents
|
* Given a format ID and its format String, will check to see if the
|
||||||
* an internal date format or not.
|
* 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 excel date format or not.
|
||||||
|
* @see isDateFormat(int,String)
|
||||||
*/
|
*/
|
||||||
public static boolean isInternalDateFormat(int format) {
|
public static boolean isInternalDateFormat(int format) {
|
||||||
boolean retval =false;
|
boolean retval =false;
|
||||||
|
@ -183,6 +183,56 @@ public class TestHSSFDateUtil
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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) {
|
public static void main(String [] args) {
|
||||||
System.out
|
System.out
|
||||||
.println("Testing org.apache.poi.hssf.usermodel.TestHSSFDateUtil");
|
.println("Testing org.apache.poi.hssf.usermodel.TestHSSFDateUtil");
|
||||||
|
Loading…
Reference in New Issue
Block a user