Можно ли смоделировать поведение sprintf ("% g") с помощью методов Rails NumberHelper? - PullRequest
2 голосов
/ 01 февраля 2010

sprintf("%g", [float]) позволяет мне форматировать число с плавающей запятой без указания точности, так что 10.00 отображается как 10, 10.01 отображается как 10.01 и так далее. Это аккуратно.

В моем приложении я рендеринг чисел с использованием методов Rails NumberHelper, чтобы я мог воспользоваться возможностями локализации, но я не могу понять, как достичь вышеуказанных функций с помощью этих помощников, поскольку они ожидают явного :precision опция.

Есть ли простой способ обойти это?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Почему бы просто не использовать Ruby's Kernel :: sprintf с NumberHelper? Рекомендуемое использование с этим синтаксисом : str % arg , где str - строка формата (%g в вашем случае):


>> "%g" % 10.01
=> "10.01"
>> "%g" % 10
=> "10"

Затем вы можете использовать NumberHelper для печати только символа валюты:


>>  foo = ActionView::Base.new
>>  foo.number_to_currency(0, :format => "%u") + "%g"%10.0 
=> "$10"

и определите свой собственный удобный метод:


 def pretty_currency(val) 
    number_to_currency(0, :format => "%u") + "%g"%val
 end

pretty_currency(10.0)  # "$10"
pretty_currency(10.01) # "$10.01"

1 голос
/ 03 февраля 2010

Я решил эту проблему, добавив другой метод в модуль NumberHelper следующим образом:

module ActionView
  module Helpers #:nodoc:
    module NumberHelper
      # Formats a +number+ such that the the level of precision is determined using the logic of sprintf("%g%"), that
      # is: "Convert a floating point number using exponential form if the exponent is less than -4 or greater than or
      #      equal to the precision, or in d.dddd form otherwise."
      # You can customize the format in the +options+ hash.
      #
      # ==== Options
      # * <tt>:separator</tt>  - Sets the separator between the units (defaults to ".").
      # * <tt>:delimiter</tt>  - Sets the thousands delimiter (defaults to "").
      #
      # ==== Examples
      #  number_with_auto_precision(111.2345)                    # => "111.2345"
      #  number_with_auto_precision(111)                         # => "111"
      #  number_with_auto_precision(1111.2345, :separator => ',', :delimiter => '.')  # "1,111.2345"
      #  number_with_auto_precision(1111, :separator => ',', :delimiter => '.')       # "1,111"
      def number_with_auto_precision(number, *args)
        options = args.extract_options!
        options.symbolize_keys!

        defaults           = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
        separator ||= (options[:separator] || defaults[:separator])
        delimiter ||= (options[:delimiter] || defaults[:delimiter])

        begin
          number_with_delimiter("%g" % number,
            :separator => separator,
            :delimiter => delimiter)
        rescue
          number
        end
      end
    end
  end
end

Это конкретный вызов number_with_delimiter с опцией %g, который отображает номер, как описано в комментариях к коду выше.

Это прекрасно работает для меня, но я бы приветствовал мысли об этом решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...