diff --git a/lib/sax-machine/handlers/sax_abstract_handler.rb b/lib/sax-machine/handlers/sax_abstract_handler.rb
index 442bc2c..2ecb5cf 100644
--- a/lib/sax-machine/handlers/sax_abstract_handler.rb
+++ b/lib/sax-machine/handlers/sax_abstract_handler.rb
@@ -65,6 +65,7 @@ def _start_element(name, attrs = [])
case element_config.data_class.to_s
when "Integer" then 0
when "Float" then 0.0
+ when "BigDecimal" then BigDecimal("0.0")
when "Symbol" then nil
when "Time" then Time.at(0)
when "" then object
@@ -180,6 +181,7 @@ def data_class_value(data_class, value)
when "String" then value != NO_BUFFER ? value.to_s : value
when "Integer" then value != NO_BUFFER ? value.to_i : value
when "Float" then value != NO_BUFFER ? value.to_s.gsub(",",".").to_f : value
+ when "BigDecimal" then value != NO_BUFFER ? BigDecimal(value.to_s.gsub(",",".")) : value
when "Symbol" then
if value != NO_BUFFER
value.to_s.empty? ? nil : value.to_s.downcase.to_sym
diff --git a/spec/sax-machine/sax_document_spec.rb b/spec/sax-machine/sax_document_spec.rb
index f87037d..97e1426 100644
--- a/spec/sax-machine/sax_document_spec.rb
+++ b/spec/sax-machine/sax_document_spec.rb
@@ -245,6 +245,40 @@ class TestFloatWithAttribute
end
end
+ describe "big decimal" do
+ before do
+ class TestBigDecimal
+ include SAXMachine
+ element :number, class: BigDecimal
+ end
+
+ class TestBigDecimalAttribute
+ include SAXMachine
+ attribute :sub_number, class: BigDecimal
+ end
+
+ class TestBigDecimalWithAttribute
+ include SAXMachine
+ element :number, class: TestBigDecimalAttribute
+ end
+ end
+
+ it "is handled in an element with '.' delimiter" do
+ document = TestBigDecimal.parse("3.0000000000000021")
+ expect(document.number).to eq(BigDecimal('3.0000000000000021'))
+ end
+
+ it "is handled in an element with ',' delimiter" do
+ document = TestBigDecimal.parse("3,0000000000000021")
+ expect(document.number).to eq(BigDecimal('3.0000000000000021'))
+ end
+
+ it "is handled in an attribute" do
+ document = TestBigDecimalWithAttribute.parse("3.0000000000000021")
+ expect(document.number.sub_number).to eq(BigDecimal('3.0000000000000021'))
+ end
+ end
+
describe "symbol" do
before do
class TestSymbol