This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-beanutils.git
The following commit(s) were added to refs/heads/master by this push:
new 1657c633 stop narrowing BigInteger and BigDecimal in
StringLocaleConverter (#408)
1657c633 is described below
commit 1657c633f6419fca9a865f3aab629747a4fbfbdf
Author: Dexter.k <[email protected]>
AuthorDate: Wed Jul 1 23:41:30 2026 +0000
stop narrowing BigInteger and BigDecimal in StringLocaleConverter (#408)
longValue() and doubleValue() drop magnitude before formatting; format the
BigInteger/BigDecimal directly so large values keep their value.
---
.../locale/converters/StringLocaleConverter.java | 6 ++-
.../converters/StringLocaleConverterTest.java | 53 ++++++++++++++++++++++
2 files changed, 57 insertions(+), 2 deletions(-)
diff --git
a/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java
b/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java
index 78ab3d87..edd10539 100644
---
a/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java
+++
b/src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java
@@ -121,9 +121,11 @@ public class StringLocaleConverter extends
BaseLocaleConverter<String> {
protected String parse(final Object value, final String pattern) throws
ParseException {
String result = null;
- if (value instanceof Integer || value instanceof Long || value
instanceof BigInteger || value instanceof Byte || value instanceof Short) {
+ if (value instanceof BigInteger || value instanceof BigDecimal) {
+ result = getDecimalFormat(locale, pattern).format(value);
+ } else if (value instanceof Integer || value instanceof Long || value
instanceof Byte || value instanceof Short) {
result = getDecimalFormat(locale, pattern).format(((Number)
value).longValue());
- } else if (value instanceof Double || value instanceof BigDecimal ||
value instanceof Float) {
+ } else if (value instanceof Double || value instanceof Float) {
result = getDecimalFormat(locale, pattern).format(((Number)
value).doubleValue());
} else if (value instanceof Date) { // java.util.Date, java.sql.Date,
java.sql.Time, java.sql.Timestamp
result = new SimpleDateFormat(pattern, locale).format(value);
diff --git
a/src/test/java/org/apache/commons/beanutils2/converters/StringLocaleConverterTest.java
b/src/test/java/org/apache/commons/beanutils2/converters/StringLocaleConverterTest.java
new file mode 100644
index 00000000..897eb4a7
--- /dev/null
+++
b/src/test/java/org/apache/commons/beanutils2/converters/StringLocaleConverterTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.beanutils2.converters;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Locale;
+
+import org.apache.commons.beanutils2.locale.converters.StringLocaleConverter;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test Case for the StringLocaleConverter class.
+ */
+class StringLocaleConverterTest extends AbstractLocaleConverterTest<String> {
+
+ /**
+ * A {@link BigDecimal} beyond {@code double} precision must keep its full
magnitude instead of being narrowed via {@code doubleValue()}.
+ */
+ @Test
+ void testConvertBigDecimalKeepsMagnitude() {
+ converter = StringLocaleConverter.builder().setLocale(Locale.US).get();
+ final BigDecimal huge = new
BigDecimal("123456789012345678901234567890");
+ assertEquals("123,456,789,012,345,678,901,234,567,890",
converter.convert(huge));
+ }
+
+ /**
+ * A {@link BigInteger} wider than a {@code long} must keep its full
magnitude instead of being narrowed via {@code longValue()}.
+ */
+ @Test
+ void testConvertBigIntegerKeepsMagnitude() {
+ converter = StringLocaleConverter.builder().setLocale(Locale.US).get();
+ final BigInteger huge = new BigInteger("99999999999999999999");
+ assertEquals("99,999,999,999,999,999,999", converter.convert(huge));
+ }
+}