RubyMoney / money

A Ruby Library for dealing with money and currency conversion.
http://rubymoney.github.io/money
MIT License
2.75k stars 626 forks source link

How to limit number of decimals with formatter? #1088

Closed stebo closed 7 months ago

stebo commented 7 months ago

Given any currency where subunit_to_unit is > 100, how can I limit the number of shown decimals via .format?

Example:

config.register_currency = {
    iso_code:            "ABC",
    name:                "ABC",
    symbol:              "ABC",
    subunit:             "cents",
    subunit_to_unit:     10000,
    thousands_separator: ".",
    decimal_mark:        ","
  }

Now Money.from_cents(12345, "ABC").format gives "1.2345 ABC"

Any way how I could just get "1.23 ABC"?

semmons99 commented 7 months ago

because we are dealing with subunits and not a decimal, the formatter does not support this. Instead, you would have to consider converting from a Money object to something like a BigDecimal so you can truncate the format. I believe you are experiencing this because you are really working with fractional amounts versus subunits. It is a nuanced challenge. You can look at JPY and see how the function as they do not use subunits.

stebo commented 7 months ago

I think this is relevant for everyone working with subunits, that have a large subunit_to_unit ratio. BTC already has its subunit Satoshis = 100000000, ETH is even more with its subunit WEI = 1000000000000000000.

Given that, having a look at BTC

Money.new(123456789, :btc).format
=> "₿1.23456789"

Would it not be interesting for the formatter to allow, shortening that by some decimals, to e.g. ₿1.2346 ? Does not mean that the actual subunit is lost, it is only about the format...

semmons99 commented 7 months ago

If the community finds value in such a pull request, we would accept it. I have just never experienced a traditional currency that would write $2.99 as $2.9 or even $2.90 as $2.9