def thousands(n, sep = ',') s = n.to_s sign = s[0] == '-' ? '-' : '' s = s[1..-1] if sign == '-' int, frac = s.split('.', 2) out = '' count = 0 int.reverse.each_char do |c| out << sep if count > 0 && count % 3 == 0 out << c count += 1 end int = out.reverse frac ? "#{sign}#{int}.#{frac}" : "#{sign}#{int}" end