From 1b795e34f794642ebbda58cc256515844146b2bd Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Walter?= Date: Fri, 16 Aug 2013 17:15:47 +0000 Subject: [PATCH] Bug 54723: Support for percentage in VALUE() function git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1514799 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/ss/formula/functions/Value.java | 17 ++++++++++++++--- .../poi/ss/formula/functions/TestValue.java | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/functions/Value.java b/src/java/org/apache/poi/ss/formula/functions/Value.java index 811db9c14c..d8bc377f97 100644 --- a/src/java/org/apache/poi/ss/formula/functions/Value.java +++ b/src/java/org/apache/poi/ss/formula/functions/Value.java @@ -34,6 +34,7 @@ import org.apache.poi.ss.formula.eval.ValueEval; * properly the result is #VALUE! error. Blank string converts to zero. * * @author Josh Micich + * @author Cédric Walter */ public final class Value extends Fixed1ArgFunction { @@ -65,6 +66,7 @@ public final class Value extends Fixed1ArgFunction { boolean foundCurrency = false; boolean foundUnaryPlus = false; boolean foundUnaryMinus = false; + boolean foundPercentage = false; int len = strText.length(); int i; @@ -123,8 +125,13 @@ public final class Value extends Fixed1ArgFunction { } switch (ch) { case ' ': - String remainingText = strText.substring(i); - if (remainingText.trim().length() > 0) { + String remainingTextTrimmed = strText.substring(i).trim(); + // support for value[space]% + if (remainingTextTrimmed.equals("%")) { + foundPercentage= true; + break; + } + if (remainingTextTrimmed.length() > 0) { // intervening spaces not allowed once the digits start return null; } @@ -162,6 +169,9 @@ public final class Value extends Fixed1ArgFunction { sb.append(strText.substring(i)); i = len; break; + case '%': + foundPercentage = true; + break; default: // all other characters are illegal return null; @@ -179,6 +189,7 @@ public final class Value extends Fixed1ArgFunction { // still a problem parsing the number - probably out of range return null; } - return new Double(foundUnaryMinus ? -d : d); + Double result = new Double(foundUnaryMinus ? -d : d); + return foundPercentage ? result /100 : result; } } diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestValue.java b/src/testcases/org/apache/poi/ss/formula/functions/TestValue.java index f85db0cfff..9c778d7e13 100644 --- a/src/testcases/org/apache/poi/ss/formula/functions/TestValue.java +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestValue.java @@ -28,6 +28,7 @@ import org.apache.poi.ss.formula.eval.ValueEval; * Tests for {@link Value} * * @author Josh Micich + * @author Cédric Walter */ public final class TestValue extends TestCase { @@ -71,6 +72,8 @@ public final class TestValue extends TestCase { confirmValue("1,000e2", 100000); confirmValue("$10e2", 1000); confirmValue("$1,000e2", 100000); + confirmValue("30%", 0.3); + confirmValue("30 %", 0.3); } public void testErrors() { -- 2.39.5