diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java index 58425caab..0d2714553 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java @@ -584,32 +584,8 @@ public static boolean isADateFormatUncached(Short formatIndex, String formatStri if (StringUtils.isEmpty(formatString)) { return false; } - String fs = formatString; - final int length = fs.length(); - StringBuilder sb = new StringBuilder(length); - for (int i = 0; i < length; i++) { - char c = fs.charAt(i); - if (i < length - 1) { - char nc = fs.charAt(i + 1); - if (c == '\\') { - switch (nc) { - case '-': - case ',': - case '.': - case ' ': - case '\\': - // skip current '\' and continue to the next char - continue; - } - } else if (c == ';' && nc == '@') { - i++; - // skip ";@" duplets - continue; - } - } - sb.append(c); - } - fs = sb.toString(); + + String fs = sanitizeString(formatString); // short-circuit if it indicates elapsed time: [h], [m] or [s] if (date_ptrn4.matcher(fs).matches()) { @@ -649,6 +625,30 @@ public static boolean isADateFormatUncached(Short formatIndex, String formatStri return result; } + private static String sanitizeString(String fs) { + final int length = fs.length(); + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; i++) { + char c = fs.charAt(i); + if (i < length - 1) { + char nc = fs.charAt(i + 1); + if (c == '\\' && isEscapableChar(nc)) { + continue; + } else if (c == ';' && nc == '@') { + i++; + // skip ";@" duplets + continue; + } + } + sb.append(c); + } + return sb.toString(); + } + + private static boolean isEscapableChar(char c) { + return c == '-' || c == ',' || c == '.' || c == ' ' || c == '\\'; + } + /** * Given a format ID this will check whether the format represents an internal excel date format or not. *