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:
parent
019db98d41
commit
6de1dc574e
@ -34,6 +34,7 @@
|
||||
|
||||
<changes>
|
||||
<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="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>
|
||||
|
@ -111,8 +111,11 @@ public class DataFormatter {
|
||||
/** 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.
|
||||
@ -278,12 +281,16 @@ public class DataFormatter {
|
||||
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;
|
||||
@ -323,8 +330,8 @@ public class DataFormatter {
|
||||
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('-'));
|
||||
@ -336,13 +343,21 @@ public class DataFormatter {
|
||||
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)) {
|
||||
return createDateFormat(formatStr, cellValue);
|
||||
|
@ -46,6 +46,24 @@ public class TestDataFormatter extends TestCase {
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user