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
This commit is contained in:
parent
ed2e2a28bc
commit
baee918c5a
@ -34,6 +34,7 @@ import org.apache.poi.ss.formula.eval.ValueEval;
|
|||||||
* properly the result is <b>#VALUE!</b> error. Blank string converts to zero.
|
* properly the result is <b>#VALUE!</b> error. Blank string converts to zero.
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
|
* @author Cédric Walter
|
||||||
*/
|
*/
|
||||||
public final class Value extends Fixed1ArgFunction {
|
public final class Value extends Fixed1ArgFunction {
|
||||||
|
|
||||||
@ -65,6 +66,7 @@ public final class Value extends Fixed1ArgFunction {
|
|||||||
boolean foundCurrency = false;
|
boolean foundCurrency = false;
|
||||||
boolean foundUnaryPlus = false;
|
boolean foundUnaryPlus = false;
|
||||||
boolean foundUnaryMinus = false;
|
boolean foundUnaryMinus = false;
|
||||||
|
boolean foundPercentage = false;
|
||||||
|
|
||||||
int len = strText.length();
|
int len = strText.length();
|
||||||
int i;
|
int i;
|
||||||
@ -123,8 +125,13 @@ public final class Value extends Fixed1ArgFunction {
|
|||||||
}
|
}
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case ' ':
|
case ' ':
|
||||||
String remainingText = strText.substring(i);
|
String remainingTextTrimmed = strText.substring(i).trim();
|
||||||
if (remainingText.trim().length() > 0) {
|
// support for value[space]%
|
||||||
|
if (remainingTextTrimmed.equals("%")) {
|
||||||
|
foundPercentage= true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (remainingTextTrimmed.length() > 0) {
|
||||||
// intervening spaces not allowed once the digits start
|
// intervening spaces not allowed once the digits start
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -162,6 +169,9 @@ public final class Value extends Fixed1ArgFunction {
|
|||||||
sb.append(strText.substring(i));
|
sb.append(strText.substring(i));
|
||||||
i = len;
|
i = len;
|
||||||
break;
|
break;
|
||||||
|
case '%':
|
||||||
|
foundPercentage = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// all other characters are illegal
|
// all other characters are illegal
|
||||||
return null;
|
return null;
|
||||||
@ -179,6 +189,7 @@ public final class Value extends Fixed1ArgFunction {
|
|||||||
// still a problem parsing the number - probably out of range
|
// still a problem parsing the number - probably out of range
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new Double(foundUnaryMinus ? -d : d);
|
Double result = new Double(foundUnaryMinus ? -d : d);
|
||||||
|
return foundPercentage ? result /100 : result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import org.apache.poi.ss.formula.eval.ValueEval;
|
|||||||
* Tests for {@link Value}
|
* Tests for {@link Value}
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
|
* @author Cédric Walter
|
||||||
*/
|
*/
|
||||||
public final class TestValue extends TestCase {
|
public final class TestValue extends TestCase {
|
||||||
|
|
||||||
@ -71,6 +72,8 @@ public final class TestValue extends TestCase {
|
|||||||
confirmValue("1,000e2", 100000);
|
confirmValue("1,000e2", 100000);
|
||||||
confirmValue("$10e2", 1000);
|
confirmValue("$10e2", 1000);
|
||||||
confirmValue("$1,000e2", 100000);
|
confirmValue("$1,000e2", 100000);
|
||||||
|
confirmValue("30%", 0.3);
|
||||||
|
confirmValue("30 %", 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testErrors() {
|
public void testErrors() {
|
||||||
|
Loading…
Reference in New Issue
Block a user