def execute(state)
width = param(0, state, nil)
digits = param(1, state, nil)
edigits = param(2, state, nil)
scale = param(3, state, 1)
overflowchar = param(4, state, nil)
padchar = param(5, state, ?\s)
exponentchar = param(6, state, nil)
arg = state.next_arg
if arg.respond_to? :to_f
num = arg.to_f
n = num == 0.0 ? 0 : Math.log10(num.abs).floor + 1
ee = edigits.nil? ? 4 : edigits + 2
ww = w.nil? ? nil : w - ee
if d.nil?
q = num.to_s.length
d = Math.max(q, Math.min(n, 7))
end
dd = d - n
if 0 <= dd and dd <= d
state.push_back_arg
parameters = [
Parameters::Integer.new(@pos, ww),
Parameters::Integer.new(@pos, dd),
Parameters::Default.new(@pos),
overflowchar.nil? ?
Parameters::Default.new(@pos) :
Parameters::Character.new(@pos, overflowchar),
padchar.nil? ?
Parameters::Default.new(@pos) :
Parameters::Character.new(@pos, padchar),
]
Factory.build(parameters, @modifiers, ?F, nil,
@pos).execute(state)
Factory.build([Parameters::Integere.new(@pos, ee)], @modifiers,
?T, nil, @pos).execute(state)
else
state.push_back_arg
Factory.build(@params, @modifiers, ?E, nil, @pos).execute(state)
end
elsif arg.respond_to? :to_int
state.push_back_arg
parameters = @params[0].nil? ? [] : [@params[0]]
Factory.build(parameters, [], ?D, nil, @pos).execute(state)
else
arg_error 'argument is not a number or a number string'
end
end