From: PJ Fanning Date: Sat, 9 Apr 2022 12:02:55 +0000 (+0000) Subject: [github-321] Fix issue with rounding in DataFormatter. Thanks to Colin Wang. This... X-Git-Tag: REL_5_2_3~368 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a8f1e7acd19669f60a7d50a83a3cc6edb20be796;p=poi.git [github-321] Fix issue with rounding in DataFormatter. Thanks to Colin Wang. This closes #321 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1899680 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index 3a7fa17d30..ab606f93dc 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -1406,9 +1406,11 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { DataFormatter dataFormatter = new DataFormatter(); FormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); XSSFCell a3 = xssfSheet.getRow(2).getCell(0); + assertEquals(2.05, a3.getNumericCellValue()); assertEquals("2.05", dataFormatter.formatCellValue(a3)); assertEquals("2.05", dataFormatter.formatCellValue(a3, formulaEvaluator)); XSSFCell a4 = xssfSheet.getRow(3).getCell(0); + assertEquals(2.05, a4.getNumericCellValue()); assertEquals("2.1", dataFormatter.formatCellValue(a4)); assertEquals("2.1", dataFormatter.formatCellValue(a4, formulaEvaluator)); } diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java b/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java index 7a18d30e68..4b8a3b8689 100644 --- a/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java +++ b/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java @@ -51,7 +51,7 @@ import org.apache.poi.util.LocaleUtil; /** - * DataFormatter contains methods for formatting the value stored in an + * DataFormatter contains methods for formatting the value stored in a * Cell. This can be useful for reports and GUI presentations when you * need to display data exactly as it appears in Excel. Supported formats * include currency, SSN, percentages, decimals, dates, phone numbers, zip @@ -139,7 +139,7 @@ public class DataFormatter { private static final Pattern localePatternGroup = Pattern.compile("(\\[\\$[^-\\]]*-[0-9A-Z]+])"); /** - * A regex to match the colour formattings rules. + * A regex to match the colour formatting's rules. * Allowed colours are: Black, Blue, Cyan, Green, * Magenta, Red, White, Yellow, "Color n" (1<=n<=56) */ @@ -948,9 +948,9 @@ public class DataFormatter { Format numberFormat = getFormat(cell, cfEvaluator); double d = cell.getNumericCellValue(); if (numberFormat == null) { - return String.valueOf(d); + return NumberToTextConverter.toText(d); } - String formatted = numberFormat.format(d); + String formatted = numberFormat.format(new BigDecimal(NumberToTextConverter.toText(d))); return formatted.replaceFirst("E(\\d)", "E+$1"); // to match Excel's E-notation } diff --git a/test-data/spreadsheet/github-321.xlsx b/test-data/spreadsheet/github-321.xlsx index 0b517e9eaa..2f50722c55 100644 Binary files a/test-data/spreadsheet/github-321.xlsx and b/test-data/spreadsheet/github-321.xlsx differ