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

Reply via email to