/** Pattern to find "AM/PM" marker */
private static final Pattern amPmPattern = Pattern.compile("((A|P)[M/P]*)", Pattern.CASE_INSENSITIVE);
- /** A regex to find patterns like [$$-1009] and [$?-452]. */
- private static final Pattern specialPatternGroup = Pattern.compile("(\\[\\$[^-\\]]*-[0-9A-Z]+\\])");
+ /**
+ * A regex to find locale patterns like [$$-1009] and [$?-452].
+ * Note that we don't currently process these into locales
+ */
+ private static final Pattern localePatternGroup = Pattern.compile("(\\[\\$[^-\\]]*-[0-9A-Z]+\\])");
/**
* A regex to match the colour formattings rules.
if (format != null) {
return format;
}
+
+ // Is it one of the special built in types, General or @?
if ("General".equalsIgnoreCase(formatStr) || "@".equals(formatStr)) {
if (isWholeNumber(cellValue)) {
return generalWholeNumFormat;
}
return generalDecimalNumFormat;
}
+
+ // Build a formatter, and cache it
format = createFormat(cellValue, formatIndex, formatStr);
formats.put(formatStr, format);
return format;
colourM = colorPattern.matcher(formatStr);
}
- // try to extract special characters like currency
- Matcher m = specialPatternGroup.matcher(formatStr);
+ // Strip off the locale information, we use an instance-wide locale for everything
+ Matcher m = localePatternGroup.matcher(formatStr);
while(m.find()) {
String match = m.group();
String symbol = match.substring(match.indexOf('$') + 1, match.indexOf('-'));
symbol = sb.toString();
}
formatStr = m.replaceAll(symbol);
- m = specialPatternGroup.matcher(formatStr);
+ m = localePatternGroup.matcher(formatStr);
}
+ // Check for special cases
if(formatStr == null || formatStr.trim().length() == 0) {
return getDefaultFormat(cellValue);
}
+
+ if ("General".equalsIgnoreCase(formatStr) || "@".equals(formatStr)) {
+ if (isWholeNumber(cellValue)) {
+ return generalWholeNumFormat;
+ }
+ return generalDecimalNumFormat;
+ }
if(DateUtil.isADateFormat(formatIndex,formatStr) &&
DateUtil.isValidExcelDate(cellValue)) {
assertEquals("12,34", dfFR.formatRawCellContents(12.34, -1, "@"));
}
+ /**
+ * At the moment, we don't decode the locale strings into
+ * a specific locale, but we should format things as if
+ * the locale (eg '[$-1010409]') isn't there
+ */
+ public void testLocaleBasedFormats() {
+ DataFormatter dfUS = new DataFormatter(Locale.US);
+
+ // Standard formats
+ assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]General"));
+ assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]@"));
+
+ // Regular numeric style formats
+ assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]##"));
+ assertEquals("63", dfUS.formatRawCellContents(63.0, -1, "[$-1010409]00"));
+
+ }
+
/**
* Ensure that colours get correctly
* zapped from within the format strings