]> source.dussan.org Git - poi.git/commitdiff
Fix bug #53389 - Handle formatting General and @ formats even if a locale is prefixed...
authorNick Burch <nick@apache.org>
Tue, 12 Jun 2012 22:10:52 +0000 (22:10 +0000)
committerNick Burch <nick@apache.org>
Tue, 12 Jun 2012 22:10:52 +0000 (22:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1349562 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/ss/usermodel/DataFormatter.java
src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java

index b2c7083a8b01bea3aecb06430e28e1bb2fecff83..e605f9ee6c2132ba5397f3d7890d4a24b3fec878 100644 (file)
@@ -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>
index 3f09aafa2b73fa41242a0bea374521c15cbe70b8..cfa20914f8bcd4a1b976bded749e7c535d55bb54 100644 (file)
@@ -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,12 +343,20 @@ 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)) {
index 499fe5442bf9660393c16f1ca0c498d7ccde186d..b8c3a78a265836a6cba42fb8acc1969df8b4fa7c 100644 (file)
@@ -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