diff options
author | Nick Burch <nick@apache.org> | 2011-12-28 05:10:24 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2011-12-28 05:10:24 +0000 |
commit | 05bfb7c0c95e5c0634d79f5fdfd3b93afc090c1d (patch) | |
tree | 53f248d2d74c113f956170bb0d7ccbfb69f252f2 | |
parent | 34760dac1100a324c4a0cea11f9a67654d3f4607 (diff) | |
download | poi-05bfb7c0c95e5c0634d79f5fdfd3b93afc090c1d.tar.gz poi-05bfb7c0c95e5c0634d79f5fdfd3b93afc090c1d.zip |
Bug #52389 - Handle ?/? format fractions as well as #/# ones, and tighten the criteria for triggering fraction formatting matching
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1225093 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/documentation/content/xdocs/status.xml | 1 | ||||
-rw-r--r-- | src/java/org/apache/poi/ss/usermodel/DataFormatter.java | 12 | ||||
-rw-r--r-- | src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java | 10 |
3 files changed, 19 insertions, 4 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 3a3d523b9d..5c420b3582 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ <changes> <release version="3.8-beta6" date="2012-??-??"> + <action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action> <action dev="poi-developers" type="add">52200 - Updated XWPF table example code </action> <action dev="poi-developers" type="add">52378 - Support for WORKDAY and NETWORKDAYS functions</action> <action dev="poi-developers" type="add">52349 - Merge the logic between the TEXT function and DataFormatter</action> diff --git a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java index 9c56adaa47..c041e32376 100644 --- a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java +++ b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java @@ -349,8 +349,9 @@ public class DataFormatter { } // Excel supports fractions in format strings, which Java doesn't - if (formatStr.indexOf("/") == formatStr.lastIndexOf("/") && - formatStr.indexOf("/") >= 0 && !formatStr.contains("-")) { + if (!formatStr.contains("-") && + (formatStr.indexOf("#/#") >= 0 && formatStr.indexOf("#/#") == formatStr.lastIndexOf("#/#")) || + (formatStr.indexOf("?/?") >= 0 && formatStr.indexOf("?/?") == formatStr.lastIndexOf("?/?"))) { return new FractionFormat(formatStr); } @@ -985,6 +986,8 @@ public class DataFormatter { if (wholePart * decPart == 0) { return "0"; } + + // Split the format string into decimal and fraction parts String[] parts = str.split(" "); String[] fractParts; if (parts.length == 2) { @@ -992,6 +995,11 @@ public class DataFormatter { } else { fractParts = str.split("/"); } + + // Excel supports both #/# and ?/?, but Java only the former + for (int i=0; i<fractParts.length; i++) { + fractParts[i] = fractParts[i].replace('?', '#'); + } if (fractParts.length == 2) { double minVal = 1.0; diff --git a/src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java b/src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java index e11ab2d60f..874725aad2 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java +++ b/src/testcases/org/apache/poi/ss/usermodel/TestDataFormatter.java @@ -168,9 +168,15 @@ public class TestDataFormatter extends TestCase { public void testFractions() { DataFormatter dfUS = new DataFormatter(Locale.US); - assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/#")); + // Excel often prefers "# #/#" + assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# #/#")); assertEquals("321 26/81", dfUS.formatRawCellContents(321.321, -1, "# #/##")); - assertEquals("26027/81", dfUS.formatRawCellContents(321.321, -1, "#/##")); + assertEquals("26027/81", dfUS.formatRawCellContents(321.321, -1, "#/##")); + + // OOo seems to like the "# ?/?" form + assertEquals("321 1/3", dfUS.formatRawCellContents(321.321, -1, "# ?/?")); + assertEquals("321 26/81", dfUS.formatRawCellContents(321.321, -1, "# ?/??")); + assertEquals("26027/81", dfUS.formatRawCellContents(321.321, -1, "?/??")); } /** |