In Ruby, you can get the sum of all numbers in an array by using Array#sum
or the Enumerable#inject
method:
# Ruby 2.4+ print [1, 2, 3, 4, 5].sum #=> 15
# Ruby <2.4 print [1, 2, 3, 4, 5].inject(0, :+) #=> 15
However, neither of these work on an array of numeric strings:
# Ruby 2.4+
# String can't be coerced into Integer (TypeError)
print ['1', '2', '3', '4', '5'].sum
# Ruby <2.4
# String can't be coerced into Integer (TypeError)
print ['1', '2', '3', '4', '5'].inject(0, :+)
Therefore, to calculate the sum of an array of numeric strings, you can do either of the following:
# Ruby 2.4+ print ['1', '2', '3', '4', '5'].map(&:to_f).sum #=> 15.0
# Ruby <2.4+ print ['1', '2', '3', '4', '5'].map(&:to_f).inject(0, :+) #=> 15.0
In both the above-mentioned instances, the Array#map
method is used to convert numbers to float first, and then sum of all elements of the array is calculated using either Array#sum
or Enumerable#inject
method. This works with numeric strings, integers, rational numbers, etc. (as you can see in the examples below):
# Ruby 2.4+ def sum(numbers) numbers.map(&:to_f).sum end print sum(['1', '2', '3', '4', '5']) #=> 15.0 print sum([1, '2', 3, '4', 5]) #=> 15.0 print sum([1, 2, 3, 4, 5]) #=> 15.0 print sum(['1.2', '-4', '4.5', '3', '10']) #=> 14.7 print sum(['1', '-2', '3', '-4', '5']) #=> 3.0 print sum(['']) #=> 0.0 print sum([]) #=> 0
# Ruby <2.4+ def sum(numbers) numbers.map(&:to_f).inject(0, :+) end print sum(['1', '2', '3', '4', '5']) #=> 15.0 print sum([1, '2', 3, '4', 5]) #=> 15.0 print sum([1, 2, 3, 4, 5]) #=> 15.0 print sum(['1.2', '-4', '4.5', '3', '10']) #=> 14.7 print sum(['1', '-2', '3', '-4', '5']) #=> 3.0 print sum(['']) #=> 0.0 print sum([]) #=> 0
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.