From 0b22717fc17ca2487d0f3860ceea2599f654fed7 Mon Sep 17 00:00:00 2001 From: Victoria Wang Date: Sun, 9 Nov 2014 21:39:40 -0600 Subject: [PATCH] Improved format_large_number that rounds to one decimal place but doesn't include tenths place if it's a zero --- ext/numeric.rb | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/ext/numeric.rb b/ext/numeric.rb index ee38d540..2dc74eef 100644 --- a/ext/numeric.rb +++ b/ext/numeric.rb @@ -22,16 +22,32 @@ class Numeric end def format_large_number - if self > 999999999 - return sprintf "%.3gB", (self/1000000000.0) - elsif self > 999999 - return sprintf "%.3gM", (self/1000000.0) - elsif self > 9999 - return sprintf "%.3gK", (self/1000.0) - elsif self > 999 - return self.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse + if self > 9999 + if self > 999999999 + unit_char = 'B' #billion + unit_amount = 1000000000.0 + elsif self > 999999 + unit_char = 'M' #million + unit_amount = 1000000.0 + elsif self > 9999 + unit_char = 'K' #thousand + unit_amount = 1000.0 + end + + self_divided = self.to_f / unit_amount + self_rounded = self_divided.round(1) + + if self_rounded.denominator == 1 + return sprintf ("%.0f" + unit_char), self_divided + else + return sprintf ("%.1f" + unit_char), self_divided + end else - return self + if self > 999 + return self.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse + else + return self + end end end