lib/ffi-icu/number_formatting.rb in ffi-icu-0.4.0 vs lib/ffi-icu/number_formatting.rb in ffi-icu-0.4.1

- old
+ new

@@ -66,20 +66,29 @@ begin Lib.check_error do |error| case number when Float needed_length = Lib.unum_format_double(@f, number, out_ptr, needed_length, nil, error) - when Fixnum - needed_length = Lib.unum_format_int32(@f, number, out_ptr, needed_length, nil, error) + when Integer + begin + # Try doing it fast, for integers that can be marshaled into an int64_t + needed_length = Lib.unum_format_int64(@f, number, out_ptr, needed_length, nil, error) + rescue RangeError + # Fall back to stringifying in Ruby and passing that to ICU + unless defined? Lib.unum_format_decimal + raise RangeError,"Number #{number} is too big to fit in int64_t and your "\ + "ICU version is too old to have unum_format_decimal" + end + string_version = number.to_s + needed_length = Lib.unum_format_decimal(@f, string_version, string_version.bytesize, out_ptr, needed_length, nil, error) + end when BigDecimal string_version = number.to_s('F') if Lib.respond_to? :unum_format_decimal needed_length = Lib.unum_format_decimal(@f, string_version, string_version.bytesize, out_ptr, needed_length, nil, error) else needed_length = Lib.unum_format_double(@f, number.to_f, out_ptr, needed_length, nil, error) end - when Bignum - needed_length = Lib.unum_format_int64(@f, number, out_ptr, needed_length, nil, error) end end out_ptr.string needed_length rescue BufferOverflowError raise BufferOverflowError, "needed: #{needed_length}" if retried