Background context: @rawfields is an array that holds the contents of
an imported line from a text file. Here are some sample lines from
the input file:
My guess is that the Perl line iterates through each of the elements
in the array and rounds any integers to 2 decimals.
This raises a few problems for me.
How can I easily tell if the (string) value in each array element
is an integer or has a decimal value?
=> The desired output for text file line 2 is :
“5.67” “0” “3.57” “1.38” “6” “0” “Foo”
I tried the following in Ruby:
@rawfields.each_index do |x|
if ( @rawfields[x].to_f > 0 ) @rawfields[x] = ( (( @rawfields[x].to_f * 100 ).round.to_i ).to_f /
100 ).to_s
end
end
But it produces the following output:
“5.67” “0” “3.57” “1.38” “6.0” “0” “Foo”
…which is close, but not quite what I want. My output file now has
values like 1.0, 5.0, 62.0, etc. If it’s an integer, I don’t want to
see the decimal.
Can anyone suggest an improvement to my code or a better translation
from Perl?
How can I easily tell if the (string) value in each array element @rawfields.each_index do |x|
…which is close, but not quite what I want. My output file now has
values like 1.0, 5.0, 62.0, etc. If it’s an integer, I don’t want to
see the decimal.
Can anyone suggest an improvement to my code or a better translation
from Perl?
This uses the fact that Float() will throw if the string is not a valid
number. If you really need “0” instead of “0.00” you could apply
another test. If you need the quotes you could do
Background context: @rawfields is an array that holds the contents of
an imported line from a text file. Here are some sample lines from
the input file:
Float(string) either converts a string to a float, or raises an
exception if it cannot be so converted.
% is the sprintf operator, so “%0.2f” % float rounds the float to two
decimal places and interpolates it into the string. Note that it does
round properly, as per the printf spec, rather than truncating.
finally, expression1 rescue expression2 means return expression1,
unless it raises an exception in which case return expression2
How can I easily tell if the (string) value in each array element @rawfields.each_index do |x|
…which is close, but not quite what I want. My output file now has
values like 1.0, 5.0, 62.0, etc. If it’s an integer, I don’t want to
see the decimal.
Can anyone suggest an improvement to my code or a better translation
from Perl?
See if this helps:
@rawfields.map! do |x|
if x =~ /^\d+.\d+$/
“%.2f” % x
else
x
end
end