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>
|
<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>
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user