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));
+    }
+}

Reply via email to