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