From fc4890eb9df5499793d5b49ddcce72485c509deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20K=C3=A4ser?= Date: Wed, 1 May 2024 08:58:11 +0200 Subject: [PATCH] Adds BigInteger support to NumberConverter (#463) --- docs/concepts/datatypes.md | 1 + .../evalex/data/conversion/NumberConverter.java | 4 ++++ .../evalex/data/conversion/NumberConverterTest.java | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/docs/concepts/datatypes.md b/docs/concepts/datatypes.md index 280d263..077df16 100644 --- a/docs/concepts/datatypes.md +++ b/docs/concepts/datatypes.md @@ -34,6 +34,7 @@ automatically be converted from one of the following Java data types: - byte - double - float +- java.math.BigInteger Be careful when passing double or float values, as these have to be converted from their floating-point arithmetic representation to a BigDecimal representation, which stores values a diff --git a/src/main/java/com/ezylang/evalex/data/conversion/NumberConverter.java b/src/main/java/com/ezylang/evalex/data/conversion/NumberConverter.java index e73d51a..f39767b 100644 --- a/src/main/java/com/ezylang/evalex/data/conversion/NumberConverter.java +++ b/src/main/java/com/ezylang/evalex/data/conversion/NumberConverter.java @@ -18,6 +18,7 @@ package com.ezylang.evalex.data.conversion; import com.ezylang.evalex.config.ExpressionConfiguration; import com.ezylang.evalex.data.EvaluationValue; import java.math.BigDecimal; +import java.math.BigInteger; /** Converter to convert to the NUMBER data type. */ public class NumberConverter implements ConverterIfc { @@ -28,6 +29,8 @@ public class NumberConverter implements ConverterIfc { if (object instanceof BigDecimal) { bigDecimal = (BigDecimal) object; + } else if (object instanceof BigInteger) { + bigDecimal = new BigDecimal((BigInteger) object, configuration.getMathContext()); } else if (object instanceof Double) { bigDecimal = new BigDecimal(Double.toString((double) object), configuration.getMathContext()); } else if (object instanceof Float) { @@ -50,6 +53,7 @@ public class NumberConverter implements ConverterIfc { @Override public boolean canConvert(Object object) { return (object instanceof BigDecimal + || object instanceof BigInteger || object instanceof Double || object instanceof Float || object instanceof Integer diff --git a/src/test/java/com/ezylang/evalex/data/conversion/NumberConverterTest.java b/src/test/java/com/ezylang/evalex/data/conversion/NumberConverterTest.java index 58f5496..f5a7036 100644 --- a/src/test/java/com/ezylang/evalex/data/conversion/NumberConverterTest.java +++ b/src/test/java/com/ezylang/evalex/data/conversion/NumberConverterTest.java @@ -21,6 +21,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.ezylang.evalex.config.ExpressionConfiguration; import com.ezylang.evalex.data.EvaluationValue; import java.math.BigDecimal; +import java.math.BigInteger; import org.junit.jupiter.api.Test; class NumberConverterTest { @@ -40,6 +41,16 @@ class NumberConverterTest { assertThat(converted.getValue()).isEqualTo(value); } + @Test + void testBigInteger() { + BigInteger value = new BigInteger("23"); + + EvaluationValue converted = converter.convert(value, defaultConfiguration); + + assertThat(converted.getDataType()).isEqualTo(EvaluationValue.DataType.NUMBER); + assertThat(converted.getNumberValue().toPlainString()).isEqualTo("23"); + } + @Test void testDouble() { double value = Double.parseDouble("2.5"); @@ -99,6 +110,7 @@ class NumberConverterTest { @Test void testCanConvert() { assertThat(converter.canConvert(new BigDecimal(8))).isTrue(); + assertThat(converter.canConvert(new BigInteger("5"))).isTrue(); assertThat(converter.canConvert(Double.parseDouble("3.0"))).isTrue(); assertThat(converter.canConvert(Float.parseFloat("2.0"))).isTrue(); assertThat(converter.canConvert(3)).isTrue(); -- 2.51.2