Fix bug #53389 - Handle formatting General and @ formats even if a locale is prefixed to them

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1349562 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2012-06-12 22:10:52 +00:00
parent 019db98d41
commit 6de1dc574e
3 changed files with 39 additions and 5 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.9-beta1" date="2012-??-??"> <release version="3.9-beta1" date="2012-??-??">
<action dev="poi-developers" type="fix">53389 - Handle formatting General and @ formats even if a locale is prefixed to them</action>
<action dev="poi-developers" type="fix">53271 - Removed unconditional asserts in SXSSF</action> <action dev="poi-developers" type="fix">53271 - Removed unconditional asserts in SXSSF</action>
<action dev="poi-developers" type="add">53025 - Updatad documentation and example on using Data Validations </action> <action dev="poi-developers" type="add">53025 - Updatad documentation and example on using Data Validations </action>
<action dev="poi-developers" type="add">53227 - Corrected AddDimensionedImage.java to support XSSF/SXSSF </action> <action dev="poi-developers" type="add">53227 - Corrected AddDimensionedImage.java to support XSSF/SXSSF </action>

View File

@ -111,8 +111,11 @@ public class DataFormatter {
/** Pattern to find "AM/PM" marker */ /** Pattern to find "AM/PM" marker */
private static final Pattern amPmPattern = Pattern.compile("((A|P)[M/P]*)", Pattern.CASE_INSENSITIVE); 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. * A regex to match the colour formattings rules.
@ -278,12 +281,16 @@ public class DataFormatter {
if (format != null) { if (format != null) {
return format; return format;
} }
// Is it one of the special built in types, General or @?
if ("General".equalsIgnoreCase(formatStr) || "@".equals(formatStr)) { if ("General".equalsIgnoreCase(formatStr) || "@".equals(formatStr)) {
if (isWholeNumber(cellValue)) { if (isWholeNumber(cellValue)) {
return generalWholeNumFormat; return generalWholeNumFormat;
} }
return generalDecimalNumFormat; return generalDecimalNumFormat;
} }
// Build a formatter, and cache it
format = createFormat(cellValue, formatIndex, formatStr); format = createFormat(cellValue, formatIndex, formatStr);
formats.put(formatStr, format); formats.put(formatStr, format);
return format; return format;
@ -323,8 +330,8 @@ public class DataFormatter {
colourM = colorPattern.matcher(formatStr); colourM = colorPattern.matcher(formatStr);
} }
// try to extract special characters like currency // Strip off the locale information, we use an instance-wide locale for everything
Matcher m = specialPatternGroup.matcher(formatStr); Matcher m = localePatternGroup.matcher(formatStr);
while(m.find()) { while(m.find()) {
String match = m.group(); String match = m.group();
String symbol = match.substring(match.indexOf('$') + 1, match.indexOf('-')); String symbol = match.substring(match.indexOf('$') + 1, match.indexOf('-'));
@ -336,13 +343,21 @@ public class DataFormatter {
symbol = sb.toString(); symbol = sb.toString();
} }
formatStr = m.replaceAll(symbol); formatStr = m.replaceAll(symbol);
m = specialPatternGroup.matcher(formatStr); m = localePatternGroup.matcher(formatStr);
} }
// Check for special cases
if(formatStr == null || formatStr.trim().length() == 0) { if(formatStr == null || formatStr.trim().length() == 0) {
return getDefaultFormat(cellValue); return getDefaultFormat(cellValue);
} }
if ("General".equalsIgnoreCase(formatStr) || "@".equals(formatStr)) {
if (isWholeNumber(cellValue)) {
return generalWholeNumFormat;
}
return generalDecimalNumFormat;
}
if(DateUtil.isADateFormat(formatIndex,formatStr) && if(DateUtil.isADateFormat(formatIndex,formatStr) &&
DateUtil.isValidExcelDate(cellValue)) { DateUtil.isValidExcelDate(cellValue)) {
return createDateFormat(formatStr, cellValue); return createDateFormat(formatStr, cellValue);

View File

@ -46,6 +46,24 @@ public class TestDataFormatter extends TestCase {
assertEquals("12,34", dfFR.formatRawCellContents(12.34, -1, "@")); 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 * Ensure that colours get correctly
* zapped from within the format strings * zapped from within the format strings