diff --git a/lib/roo/excelx/cell/number.rb b/lib/roo/excelx/cell/number.rb index 5cd9b552..d37fcbce 100644 --- a/lib/roo/excelx/cell/number.rb +++ b/lib/roo/excelx/cell/number.rb @@ -20,14 +20,26 @@ def create_numeric(number) return number if Excelx::ERROR_VALUES.include?(number) case @format when /%/ - Float(number) + cast_float(number) when /\.0/ - Float(number) + cast_float(number) else - (number.include?('.') || (/\A[-+]?\d+E[-+]?\d+\z/i =~ number)) ? Float(number) : Integer(number, 10) + (number.include?('.') || (/\A[-+]?\d+E[-+]?\d+\z/i =~ number)) ? cast_float(number) : cast_int(number, 10) end end + def cast_float(number) + return 0.0 if number == '' + + Float(number) + end + + def cast_int(number, base = 10) + return 0 if number == '' + + Integer(number, base) + end + def formatted_value return @cell_value if Excelx::ERROR_VALUES.include?(@cell_value) diff --git a/spec/lib/roo/excelx_spec.rb b/spec/lib/roo/excelx_spec.rb index 10b0caf5..fa69c0c4 100755 --- a/spec/lib/roo/excelx_spec.rb +++ b/spec/lib/roo/excelx_spec.rb @@ -616,6 +616,15 @@ end end + describe 'empty value cells with no format' do + let(:path) { 'test/files/empty_numeric_cell.xlsx' } + + it 'returns 0 for empty numeric cells' do + expect(subject.excelx_value(3, 2)).to eq('') + expect(subject.cell(3, 2)).to eq(0) + end + end + describe 'opening a file with a chart sheet' do let(:path) { 'test/files/chart_sheet.xlsx' } it 'should not raise' do diff --git a/test/excelx/cell/test_number.rb b/test/excelx/cell/test_number.rb index ddcffeb4..8919b5f1 100644 --- a/test/excelx/cell/test_number.rb +++ b/test/excelx/cell/test_number.rb @@ -15,6 +15,11 @@ def test_integer assert_kind_of(Integer, cell.value) end + def test_blank + cell = Roo::Excelx::Cell::Number.new '', nil, ['0'], nil, nil, nil + assert_kind_of(Integer, cell.value) + end + def test_scientific_notation cell = Roo::Excelx::Cell::Number.new '1.2E-3', nil, ['0'], nil, nil, nil assert_kind_of(Float, cell.value) diff --git a/test/files/empty_numeric_cell.xlsx b/test/files/empty_numeric_cell.xlsx new file mode 100644 index 00000000..d5d9fdf9 Binary files /dev/null and b/test/files/empty_numeric_cell.xlsx differ