This is an automated email from the ASF dual-hosted git repository.

terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 44abc8bec08 Fix locale-sensitive number formatting in 
AutoIntervalShardingAlgorithm (#38806)
44abc8bec08 is described below

commit 44abc8bec0809a734c2d447b45429682c6ffa6f0
Author: Maxim Sentyabrskiy <[email protected]>
AuthorDate: Fri Jun 5 12:23:13 2026 +0300

    Fix locale-sensitive number formatting in AutoIntervalShardingAlgorithm 
(#38806)
    
    * Fix locale-sensitive number formatting in AutoIntervalShardingAlgorithm
    
    DecimalFormat without an explicit locale uses the JVM default locale,
    so on locales that use a comma as the decimal separator (e.g. ru_RU)
    it produces values like "11,00" which then fail Double.parseDouble with
    NumberFormatException. Use Locale.ROOT symbols to keep formatting and
    parsing locale-independent.
    
    * fix review
    
    * Re-trigger CI
    
    ---------
    
    Co-authored-by: makssent <[email protected]>
---
 .../datetime/AutoIntervalShardingAlgorithm.java      |  4 +++-
 .../datetime/AutoIntervalShardingAlgorithmTest.java  | 20 ++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithm.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithm.java
index 0f8c0078f65..64e93be8f98 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithm.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithm.java
@@ -31,12 +31,14 @@ import 
org.apache.shardingsphere.sharding.exception.data.InvalidDatetimeFormatEx
 import 
org.apache.shardingsphere.sharding.exception.data.NullShardingValueException;
 
 import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
 import java.text.ParsePosition;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeParseException;
 import java.util.Collection;
 import java.util.LinkedHashSet;
+import java.util.Locale;
 import java.util.Properties;
 
 /**
@@ -99,7 +101,7 @@ public final class AutoIntervalShardingAlgorithm implements 
StandardShardingAlgo
     }
     
     private int doSharding(final long shardingValue) {
-        String position = new DecimalFormat("0.00").format((double) 
shardingValue / shardingSeconds);
+        String position = new DecimalFormat("0.00", 
DecimalFormatSymbols.getInstance(Locale.ROOT)).format((double) shardingValue / 
shardingSeconds);
         return Math.min(Math.max(0, (int) 
Math.ceil(Double.parseDouble(position))), autoTablesAmount - 1);
     }
     
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithmTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithmTest.java
index 0d5854b60bb..d8a581f0740 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithmTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/AutoIntervalShardingAlgorithmTest.java
@@ -33,6 +33,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Properties;
 
 import static org.hamcrest.Matchers.is;
@@ -72,6 +73,25 @@ class AutoIntervalShardingAlgorithmTest {
                 new PreciseShardingValue<>("t_order", "create_time", 
DATA_NODE_INFO, "2021-01-01 00:00:02")), is("t_order_5"));
     }
     
+    @Test
+    void assertDoShardingWithCommaDecimalDefaultLocale() {
+        Locale defaultLocale = Locale.getDefault();
+        Locale.setDefault(Locale.GERMANY);
+        try {
+            List<String> availableTargetNames = Arrays.asList("t_order_0", 
"t_order_1", "t_order_2", "t_order_3", "t_order_4");
+            assertThat(shardingAlgorithm.doSharding(availableTargetNames,
+                    new PreciseShardingValue<>("t_order", "create_time", 
DATA_NODE_INFO, "2020-01-01 00:00:01")), is("t_order_1"));
+            Collection<String> actual = 
shardingAlgorithm.doSharding(availableTargetNames,
+                    new RangeShardingValue<>("t_order", "create_time", 
DATA_NODE_INFO, Range.closed("2020-01-01 00:00:04", "2020-01-01 00:00:10")));
+            assertThat(actual.size(), is(3));
+            assertTrue(actual.contains("t_order_1"));
+            assertTrue(actual.contains("t_order_2"));
+            assertTrue(actual.contains("t_order_3"));
+        } finally {
+            Locale.setDefault(defaultLocale);
+        }
+    }
+    
     @Test
     void assertRangeDoShardingWithAllRange() {
         List<String> availableTargetNames = Arrays.asList("t_order_0", 
"t_order_1", "t_order_2", "t_order_3", "t_order_4");

Reply via email to