Class: NumberCell
- Inherits:
-
SurpassCell
- Object
- SurpassCell
- NumberCell
- Defined in:
- lib/surpass/surpass_cell.rb
Instance Attribute Summary
Attributes inherited from SurpassCell
Instance Method Summary collapse
-
#initialize(parent, index, format_index, number) ⇒ NumberCell
constructor
A new instance of NumberCell.
- #rk_record(rk_encoded) ⇒ Object
-
#to_biff ⇒ Object
TODO test this section to be sure numbers are categorized and packed correctly.
Methods inherited from SurpassCell
Constructor Details
#initialize(parent, index, format_index, number) ⇒ NumberCell
Returns a new instance of NumberCell.
47 48 49 50 51 52 |
# File 'lib/surpass/surpass_cell.rb', line 47 def initialize(parent, index, format_index, number) @parent = parent @index = index @format_index = format_index @number = number end |
Instance Method Details
#rk_record(rk_encoded) ⇒ Object
54 55 56 |
# File 'lib/surpass/surpass_cell.rb', line 54 def rk_record(rk_encoded) RKRecord.new(@parent.index, @index, @format_index, rk_encoded).to_biff end |
#to_biff ⇒ Object
TODO test this section to be sure numbers are categorized and packed correctly.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/surpass/surpass_cell.rb', line 59 def to_biff # 30 bit signed int in_range = (-0x20000000 <= @number) && (@number < 0x20000000) is_int = (@number.to_i == @number) if in_range && is_int rk_encoded = 2 | (@number.to_i << 2) return rk_record(rk_encoded) end # try scaling by 100 then using a 30 bit signed int in_range = (-0x20000000 <= @number * 100) && (@number * 100 < 0x20000000) round_trip = (@number.to_i*100) == @number*100 if in_range && round_trip rk_encoded = (3 | (@number.to_i*100 << 2)) return rk_record(rk_encoded) end w0, w1, w2, w3 = [@number].pack('E').unpack('v4') is_float_rk = (w0 == 0) && (w1 == 0) && (w2 & 0xFFFC) == w2 if is_float_rk rk_encoded = (w3 << 16) | w2 return rk_record(rk_encoded) end w0, w1, w2, w3 = [@number * 100].pack('E').unpack('v4') is_float_rk_100 = w0 == 0 && w1 == 0 && w2 & 0xFFFC == w2 if is_float_rk_100 rk_encoded = 1 | (w3 << 16) | w2 return rk_record(rk_encoded) end # If not an RK value, use a NumberRecord instead. NumberRecord.new(@parent.index, @index, @format_index, @number).to_biff end |