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");