aboutsummaryrefslogtreecommitdiffstats
path: root/lib/roo/excelx/cell/number.rb
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:40:56 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:40:56 -0500
commitdddfa903d2b856146f05ffb4415c31d6127bb5bf (patch)
treee38c2aca92b54f06ccd0185f48dc47e3e1b3d77e /lib/roo/excelx/cell/number.rb
parent8280a21a23d44aa90177e2bc041d0b8dc8556f4b (diff)
New upstream version 2.8.0upstream/2.8.0
Diffstat (limited to 'lib/roo/excelx/cell/number.rb')
-rw-r--r--lib/roo/excelx/cell/number.rb69
1 files changed, 35 insertions, 34 deletions
diff --git a/lib/roo/excelx/cell/number.rb b/lib/roo/excelx/cell/number.rb
index 2015562..9f23c4f 100644
--- a/lib/roo/excelx/cell/number.rb
+++ b/lib/roo/excelx/cell/number.rb
@@ -1,16 +1,19 @@
+# frozen_string_literal: true
+
module Roo
class Excelx
class Cell
class Number < Cell::Base
- attr_reader :value, :formula, :format, :cell_value, :link, :coordinate
+ attr_reader :value, :formula, :format, :cell_value, :coordinate
+
+ # FIXME: change default_type to number. This will break brittle tests.
+ attr_reader_with_default default_type: :float
def initialize(value, formula, excelx_type, style, link, coordinate)
super
- # FIXME: change @type to number. This will break brittle tests.
# FIXME: Excelx_type is an array, but the first value isn't used.
- @type = :float
@format = excelx_type.last
- @value = link? ? Roo::Link.new(link, value) : create_numeric(value)
+ @value = link ? Roo::Link.new(link, value) : create_numeric(value)
end
def create_numeric(number)
@@ -21,48 +24,50 @@ module Roo
when /\.0/
Float(number)
else
- (number.include?('.') || (/\A[-+]?\d+E[-+]\d+\z/i =~ number)) ? Float(number) : Integer(number)
+ (number.include?('.') || (/\A[-+]?\d+E[-+]?\d+\z/i =~ number)) ? Float(number) : Integer(number, 10)
end
end
def formatted_value
return @cell_value if Excelx::ERROR_VALUES.include?(@cell_value)
- formatter = formats[@format]
+ formatter = generate_formatter(@format)
if formatter.is_a? Proc
formatter.call(@cell_value)
- elsif zero_padded_number?
- "%0#{@format.size}d" % @cell_value
else
Kernel.format(formatter, @cell_value)
end
end
- def formats
+ def generate_formatter(format)
# FIXME: numbers can be other colors besides red:
# [BLACK], [BLUE], [CYAN], [GREEN], [MAGENTA], [RED], [WHITE], [YELLOW], [COLOR n]
- {
- 'General' => '%.0f',
- '0' => '%.0f',
- '0.00' => '%.2f',
- '0.000000' => '%.6f',
- '#,##0' => number_format('%.0f'),
- '#,##0.00' => number_format('%.2f'),
- '0%' => proc do |number|
- Kernel.format('%d%', number.to_f * 100)
- end,
- '0.00%' => proc do |number|
- Kernel.format('%.2f%', number.to_f * 100)
- end,
- '0.00E+00' => '%.2E',
- '#,##0 ;(#,##0)' => number_format('%.0f', '(%.0f)'),
- '#,##0 ;[Red](#,##0)' => number_format('%.0f', '[Red](%.0f)'),
- '#,##0.00;(#,##0.00)' => number_format('%.2f', '(%.2f)'),
- '#,##0.00;[Red](#,##0.00)' => number_format('%.2f', '[Red](%.2f)'),
+ case format
+ when /^General$/i then '%.0f'
+ when '0' then '%.0f'
+ when /^(0+)$/ then "%0#{$1.size}d"
+ when /^0\.(0+)$/ then "%.#{$1.size}f"
+ when '#,##0' then number_format('%.0f')
+ when '#,##0.00' then number_format('%.2f')
+ when '0%'
+ proc do |number|
+ Kernel.format('%d%%', number.to_f * 100)
+ end
+ when '0.00%'
+ proc do |number|
+ Kernel.format('%.2f%%', number.to_f * 100)
+ end
+ when '0.00E+00' then '%.2E'
+ when '#,##0 ;(#,##0)' then number_format('%.0f', '(%.0f)')
+ when '#,##0 ;[Red](#,##0)' then number_format('%.0f', '[Red](%.0f)')
+ when '#,##0.00;(#,##0.00)' then number_format('%.2f', '(%.2f)')
+ when '#,##0.00;[Red](#,##0.00)' then number_format('%.2f', '[Red](%.2f)')
# FIXME: not quite sure what the format should look like in this case.
- '##0.0E+0' => '%.1E',
- '@' => proc { |number| number }
- }
+ when '##0.0E+0' then '%.1E'
+ when '@' then proc { |number| number }
+ else
+ raise "Unknown format: #{format.inspect}"
+ end
end
private
@@ -77,10 +82,6 @@ module Roo
Kernel.format(formatter, number).reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
end
end
-
- def zero_padded_number?
- @format[/0+/] == @format
- end
end
end
end