Repository: incubator-groovy Updated Branches: refs/heads/GROOVY_2_4_X 18c6c6a6a -> 4c88790cd
GROOVY-6922 - JsonSlurper loses trailing 0's in numbers (closes #184) Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/4c88790c Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/4c88790c Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/4c88790c Branch: refs/heads/GROOVY_2_4_X Commit: 4c88790cd07dc50472072037dc12ece0144b4a11 Parents: 18c6c6a Author: John Wagenleitner <john.wagenleit...@gmail.com> Authored: Sat Nov 7 12:50:14 2015 -0800 Committer: pascalschumacher <pascalschumac...@gmx.net> Committed: Tue Nov 10 21:53:19 2015 +0100 ---------------------------------------------------------------------- .../java/groovy/json/internal/CharScanner.java | 17 +-------------- .../groovy/json/internal/CharScannerTest.groovy | 22 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/4c88790c/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java b/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java index f140cf6..e110943 100644 --- a/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java +++ b/subprojects/groovy-json/src/main/java/groovy/json/internal/CharScanner.java @@ -653,23 +653,8 @@ public class CharScanner { } else { value = parseLongFromTo(buffer, from, index); } - } else if (foundDot && simple) { - BigDecimal lvalue; - - if (length < powersOf10.length) { - if (isInteger(buffer, from, length)) { - lvalue = new BigDecimal(parseIntFromToIgnoreDot(buffer, from, index)); - } else { - lvalue = new BigDecimal(parseLongFromToIgnoreDot(buffer, from, index)); - } - - BigDecimal power = new BigDecimal(powersOf10[digitsPastPoint]); - value = lvalue.divide(power); - } else { - value = new BigDecimal(new String(buffer, from, length)); - } } else { - value = new BigDecimal(new String(buffer, from, index - from)); + value = parseBigDecimal(buffer, from, length); } if (size != null) { http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/4c88790c/subprojects/groovy-json/src/test/groovy/groovy/json/internal/CharScannerTest.groovy ---------------------------------------------------------------------- diff --git a/subprojects/groovy-json/src/test/groovy/groovy/json/internal/CharScannerTest.groovy b/subprojects/groovy-json/src/test/groovy/groovy/json/internal/CharScannerTest.groovy index 70df7c8..e5e69b6 100644 --- a/subprojects/groovy-json/src/test/groovy/groovy/json/internal/CharScannerTest.groovy +++ b/subprojects/groovy-json/src/test/groovy/groovy/json/internal/CharScannerTest.groovy @@ -624,6 +624,28 @@ class CharScannerTest extends GroovyTestCase { ) } + void testParseJsonNumberToDecimal() { + def num = CharScanner.parseJsonNumber('123.40'.toCharArray()) + assert num instanceof BigDecimal + assert num == 123.40G + assert num.scale() == 2 + + num = CharScanner.parseJsonNumber('-123.400'.toCharArray()) + assert num instanceof BigDecimal + assert num == -123.400G + assert num.scale() == 3 + + num = CharScanner.parseJsonNumber('3.7e-5'.toCharArray()) + assert num instanceof BigDecimal + assert num == 0.000037G + assert num.scale() == 6 + + num = CharScanner.parseJsonNumber('-1.25E+7'.toCharArray()) + assert num instanceof BigDecimal + assert num == -12500000.0G + assert num.scale() == -5 + } + protected assertArrayEquals(char[] expected, char[] actual) { assertArrayEquals((Object[]) expected, (Object[]) actual) }