in poi/src/main/java/org/apache/poi/ss/format/CellFormatPart.java [331:393]
private CellFormatType formatType(String fdesc) {
fdesc = fdesc.trim();
if (fdesc.isEmpty() || fdesc.equalsIgnoreCase("General"))
return CellFormatType.GENERAL;
Matcher m = SPECIFICATION_PAT.matcher(fdesc);
boolean couldBeDate = false;
boolean seenZero = false;
while (m.find()) {
String repl = m.group(0);
Iterator<String> codePoints = CodepointsUtil.iteratorFor(repl);
if (codePoints.hasNext()) {
String c1 = codePoints.next();
switch (c1) {
case "@":
return CellFormatType.TEXT;
case "d":
case "D":
case "y":
case "Y":
return CellFormatType.DATE;
case "h":
case "H":
case "m":
case "M":
case "s":
case "S":
// These can be part of date, or elapsed
couldBeDate = true;
break;
case "0":
// This can be part of date, elapsed, or number
seenZero = true;
break;
case "[":
String c2 = null;
if (codePoints.hasNext())
c2 = codePoints.next().toLowerCase(Locale.ROOT);
if ("h".equals(c2) || "m".equals(c2) || "s".equals(c2)) {
return CellFormatType.ELAPSED;
}
if ("$".equals(c2)) {
// Localised currency
return CellFormatType.NUMBER;
}
// Something else inside [] which isn't supported!
throw new IllegalArgumentException("Unsupported [] format block '" +
repl + "' in '" + fdesc + "' with c2: " + c2);
case "#":
case "?":
return CellFormatType.NUMBER;
}
}
}
// Nothing definitive was found, so we figure out it deductively
if (couldBeDate)
return CellFormatType.DATE;
if (seenZero)
return CellFormatType.NUMBER;
return CellFormatType.TEXT;
}