This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new 6c17b79450 GH-43877: [Ruby] Add support for 0 decimal value (#43882)
6c17b79450 is described below
commit 6c17b794509d3931225cf295ae864204162c786f
Author: Sutou Kouhei <[email protected]>
AuthorDate: Thu Aug 29 17:53:14 2024 +0900
GH-43877: [Ruby] Add support for 0 decimal value (#43882)
### Rationale for this change
Apache Arrow C++ may use "0.EXXX" string such as "0.E-9" for 0 decimal
value. Ruby's BigDecimal doesn't accept it.
### What changes are included in this PR?
We convert "0.EXXX" to "0.0EXXX" in Ruby.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
Yes.
* GitHub Issue: #43877
Authored-by: Sutou Kouhei <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
ruby/red-arrow/lib/arrow/decimal128-array.rb | 4 +++-
ruby/red-arrow/lib/arrow/decimal256-array.rb | 4 +++-
ruby/red-arrow/test/test-decimal128-array.rb | 6 ++++++
ruby/red-arrow/test/test-decimal256-array.rb | 6 ++++++
4 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/ruby/red-arrow/lib/arrow/decimal128-array.rb
b/ruby/red-arrow/lib/arrow/decimal128-array.rb
index a5ee53be7b..528c878a85 100644
--- a/ruby/red-arrow/lib/arrow/decimal128-array.rb
+++ b/ruby/red-arrow/lib/arrow/decimal128-array.rb
@@ -18,7 +18,9 @@
module Arrow
class Decimal128Array
def get_value(i)
- BigDecimal(format_value(i))
+ string = format_value(i)
+ string.sub!(".E", ".0E") if string.include?(".E")
+ BigDecimal(string)
end
end
end
diff --git a/ruby/red-arrow/lib/arrow/decimal256-array.rb
b/ruby/red-arrow/lib/arrow/decimal256-array.rb
index 8c2306dfe3..32841ca486 100644
--- a/ruby/red-arrow/lib/arrow/decimal256-array.rb
+++ b/ruby/red-arrow/lib/arrow/decimal256-array.rb
@@ -19,7 +19,9 @@ module Arrow
class Decimal256Array
# @since 3.0.0
def get_value(i)
- BigDecimal(format_value(i))
+ string = format_value(i)
+ string.sub!(".E", ".0E") if string.include?(".E")
+ BigDecimal(string)
end
end
end
diff --git a/ruby/red-arrow/test/test-decimal128-array.rb
b/ruby/red-arrow/test/test-decimal128-array.rb
index a50e2cf4a4..a6e7c4e1ac 100644
--- a/ruby/red-arrow/test/test-decimal128-array.rb
+++ b/ruby/red-arrow/test/test-decimal128-array.rb
@@ -38,4 +38,10 @@ class Decimal128ArrayTest < Test::Unit::TestCase
array.to_a)
end
end
+
+ def test_zero
+ array = Arrow::Decimal128Array.new({precision: 38, scale: 9},
+ [BigDecimal("0")])
+ assert_equal(BigDecimal("0"), array[0])
+ end
end
diff --git a/ruby/red-arrow/test/test-decimal256-array.rb
b/ruby/red-arrow/test/test-decimal256-array.rb
index ed542f2d6c..053e948fc8 100644
--- a/ruby/red-arrow/test/test-decimal256-array.rb
+++ b/ruby/red-arrow/test/test-decimal256-array.rb
@@ -38,4 +38,10 @@ class Decimal256ArrayTest < Test::Unit::TestCase
array.to_a)
end
end
+
+ def test_zero
+ array = Arrow::Decimal256Array.new({precision: 38, scale: 9},
+ [BigDecimal("0")])
+ assert_equal(BigDecimal("0"), array[0])
+ end
end