summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorToms Mikoss <[email protected]>2020-09-17 10:16:08 +0300
committerStefan Daschek <[email protected]>2020-12-03 23:33:17 +0100
commit07f97cb90d59e77d74773851a22a7dd4a8115145 (patch)
treed0b28252cc19d500749c5aed7c8d488ae08693ca
parente4aeec68c8b7bb699db876df375a1e98187b21ac (diff)
downloadcaxlsx-07f97cb90d59e77d74773851a22a7dd4a8115145.tar.gz
caxlsx-07f97cb90d59e77d74773851a22a7dd4a8115145.zip
Extend cell_type_from_value with sanity checks
-rw-r--r--lib/axlsx/workbook/worksheet/cell.rb6
-rw-r--r--test/workbook/worksheet/tc_cell.rb25
2 files changed, 28 insertions, 3 deletions
diff --git a/lib/axlsx/workbook/worksheet/cell.rb b/lib/axlsx/workbook/worksheet/cell.rb
index a066ba91..a11bddfd 100644
--- a/lib/axlsx/workbook/worksheet/cell.rb
+++ b/lib/axlsx/workbook/worksheet/cell.rb
@@ -451,11 +451,11 @@ module Axlsx
:time
elsif v.is_a?(TrueClass) || v.is_a?(FalseClass)
:boolean
- elsif v.to_s =~ Axlsx::NUMERIC_REGEX
+ elsif v.to_s =~ Axlsx::NUMERIC_REGEX && v.respond_to?(:to_i)
:integer
- elsif v.to_s =~ Axlsx::SAFE_FLOAT_REGEX
+ elsif v.to_s =~ Axlsx::SAFE_FLOAT_REGEX && v.respond_to?(:to_f)
:float
- elsif (matchdata = v.to_s.match(MAYBE_FLOAT_REGEX)) && (Float::MIN_10_EXP..Float::MAX_10_EXP).cover?(matchdata[:exp].to_i)
+ elsif (matchdata = v.to_s.match(MAYBE_FLOAT_REGEX)) && (Float::MIN_10_EXP..Float::MAX_10_EXP).cover?(matchdata[:exp].to_i) && v.respond_to?(:to_f)
:float
elsif v.to_s =~ Axlsx::ISO_8601_REGEX
:iso_8601
diff --git a/test/workbook/worksheet/tc_cell.rb b/test/workbook/worksheet/tc_cell.rb
index d6f5aeae..3a7c1566 100644
--- a/test/workbook/worksheet/tc_cell.rb
+++ b/test/workbook/worksheet/tc_cell.rb
@@ -120,6 +120,31 @@ class TestCell < Test::Unit::TestCase
assert_equal(:iso_8601, @c.send(:cell_type_from_value, '2008-08-30T01:45:36.123+09:00'))
end
+ def test_cell_type_from_value_looks_like_number_but_is_not
+ mimic_number = Class.new do
+ def initialize(to_s_value)
+ @to_s_value = to_s_value
+ end
+
+ def to_s
+ @to_s_value
+ end
+ end
+
+ number_strings = [
+ '1',
+ '1234567890',
+ '1.0',
+ '1e1',
+ '0',
+ "1e#{Float::MIN_10_EXP}"
+ ]
+
+ number_strings.each do |number_string|
+ assert_equal(@c.send(:cell_type_from_value, mimic_number.new(number_string)), :string)
+ end
+ end
+
def test_cast_value
@c.type = :string
assert_equal(@c.send(:cast_value, 1.0), "1.0")