This is an automated email from the ASF dual-hosted git repository.
fanjia pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new e70fc5dc2d [Bugfix][seatunnel-formats] Numeric type fields are written
to local csv, and the text file appears in scientific notation (#10244)
e70fc5dc2d is described below
commit e70fc5dc2d47d85e8c8080def9df93af4b5d77c1
Author: 老王 <[email protected]>
AuthorDate: Thu Jan 1 10:07:20 2026 +0800
[Bugfix][seatunnel-formats] Numeric type fields are written to local csv,
and the text file appears in scientific notation (#10244)
---
.../format/csv/CsvSerializationSchema.java | 5 +++-
.../format/text/TextSerializationSchema.java | 5 +++-
.../format/text/TextFormatSchemaTest.java | 33 ++++++++++++++++++++++
3 files changed, 41 insertions(+), 2 deletions(-)
diff --git
a/seatunnel-formats/seatunnel-format-csv/src/main/java/org/apache/seatunnel/format/csv/CsvSerializationSchema.java
b/seatunnel-formats/seatunnel-format-csv/src/main/java/org/apache/seatunnel/format/csv/CsvSerializationSchema.java
index e539f9d932..10d5162efe 100644
---
a/seatunnel-formats/seatunnel-format-csv/src/main/java/org/apache/seatunnel/format/csv/CsvSerializationSchema.java
+++
b/seatunnel-formats/seatunnel-format-csv/src/main/java/org/apache/seatunnel/format/csv/CsvSerializationSchema.java
@@ -38,6 +38,7 @@ import org.apache.commons.csv.QuoteMode;
import lombok.NonNull;
import java.io.StringWriter;
+import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
@@ -178,8 +179,10 @@ public class CsvSerializationSchema implements
SerializationSchema {
case TINYINT:
case SMALLINT:
case BIGINT:
- case DECIMAL:
return field.toString();
+ case DECIMAL:
+ BigDecimal bd = (BigDecimal) field;
+ return bd.stripTrailingZeros().toPlainString();
case STRING:
byte[] bytes =
field.toString().getBytes(StandardCharsets.UTF_8);
String str = new String(bytes, StandardCharsets.UTF_8);
diff --git
a/seatunnel-formats/seatunnel-format-text/src/main/java/org/apache/seatunnel/format/text/TextSerializationSchema.java
b/seatunnel-formats/seatunnel-format-text/src/main/java/org/apache/seatunnel/format/text/TextSerializationSchema.java
index 01ca981a11..08f7bd7eab 100644
---
a/seatunnel-formats/seatunnel-format-text/src/main/java/org/apache/seatunnel/format/text/TextSerializationSchema.java
+++
b/seatunnel-formats/seatunnel-format-text/src/main/java/org/apache/seatunnel/format/text/TextSerializationSchema.java
@@ -32,6 +32,7 @@ import
org.apache.seatunnel.format.text.exception.SeaTunnelTextFormatException;
import lombok.NonNull;
+import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
@@ -161,8 +162,10 @@ public class TextSerializationSchema implements
SerializationSchema {
case TINYINT:
case SMALLINT:
case BIGINT:
- case DECIMAL:
return field.toString();
+ case DECIMAL:
+ BigDecimal bd = (BigDecimal) field;
+ return bd.stripTrailingZeros().toPlainString();
case STRING:
byte[] bytes =
field.toString().getBytes(StandardCharsets.UTF_8);
return new String(bytes, StandardCharsets.UTF_8);
diff --git
a/seatunnel-formats/seatunnel-format-text/src/test/java/org/apache/seatunnel/format/text/TextFormatSchemaTest.java
b/seatunnel-formats/seatunnel-format-text/src/test/java/org/apache/seatunnel/format/text/TextFormatSchemaTest.java
index 8b79339fec..3e57e3ce83 100644
---
a/seatunnel-formats/seatunnel-format-text/src/test/java/org/apache/seatunnel/format/text/TextFormatSchemaTest.java
+++
b/seatunnel-formats/seatunnel-format-text/src/test/java/org/apache/seatunnel/format/text/TextFormatSchemaTest.java
@@ -33,6 +33,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
+import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Map;
@@ -250,4 +251,36 @@ public class TextFormatSchemaTest {
Assertions.assertEquals(1, seaTunnelRow.getField(0));
Assertions.assertEquals("tyrantlucifer", seaTunnelRow.getField(1));
}
+
+ @Test
+ void testFormatDecimal() {
+ // test 0000.01000
+ assertEquals("0.01000", formatDecimalWithToString(new
BigDecimal("0000.01000")));
+ assertEquals("0.01000", formatDecimalWithToPlainString(new
BigDecimal("0000.01000")));
+ assertEquals("0.01", formatDecimal(new BigDecimal("0000.01000")));
+ // test 10.000
+ assertEquals("10.000", formatDecimalWithToString(new
BigDecimal("10.000")));
+ assertEquals("10.000", formatDecimalWithToPlainString(new
BigDecimal("10.000")));
+ assertEquals("10", formatDecimal(new BigDecimal("10.000")));
+ // test 1E-15
+ assertEquals("1E-15", formatDecimalWithToString(new
BigDecimal("1E-15")));
+ assertEquals("0.000000000000001", formatDecimalWithToPlainString(new
BigDecimal("1E-15")));
+ assertEquals("0.000000000000001", formatDecimal(new
BigDecimal("1E-15")));
+ // test 0E-15
+ assertEquals("0E-15", formatDecimalWithToString(new
BigDecimal("0E-15")));
+ assertEquals("0.000000000000000", formatDecimalWithToPlainString(new
BigDecimal("0E-15")));
+ assertEquals("0", formatDecimal(new BigDecimal("0E-15")));
+ }
+
+ private String formatDecimal(BigDecimal bd) {
+ return bd.stripTrailingZeros().toPlainString();
+ }
+
+ private String formatDecimalWithToString(BigDecimal bd) {
+ return bd.toString();
+ }
+
+ private String formatDecimalWithToPlainString(BigDecimal bd) {
+ return bd.toPlainString();
+ }
}