marick
Library for converting numbers to words?
I’d like to print “zero reservations”, “one reservation”, “two reservations”, etc. I can use inflex to get plurals and singulars, but I can’t find anything that’s the equivalent of Ruby’s to_words or humanize gems. Neither inflex nor Number has what I want:
to_word(1) # "one"
Am I missing something? Were I to port one of the Ruby libraries, is there an Elixir library to target for a pull request?
Marked As Solved
kip
Thanks for the shoutout. The package on hex is ex_cldr_numbers (I am the author). Some examples from the readme:
Formatting numbers as words, ordinals and roman numerals
- As words. For example, formatting 123 into “one hundred and twenty-three” for the “en” locale. The applicable format types are
:spelloutand:spellout_verbose.
iex> MyApp.Cldr.Number.to_string 123, format: :spellout
{:ok, "one hundred twenty-three"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "de"
{:ok, "einhundertdreiundzwanzig"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "fr"
{:ok, "cent vingt-trois"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "th"
{:ok, "หนึ่งร้อยยี่สิบสาม"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "he"
{:ok, "מאה עשרים ושלוש"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "es"
{:ok, "ciento veintitrés"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout, locale: "zh"
{:ok, "一百二十三"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout_verbose
{:ok, "one hundred and twenty-three"}
- As a year. In many languages the written form of a year is different to that used for an arbitrary number. For example, formatting 1989 would result in “nineteen eighty-nine”. The applicable format type is
:spellout_year.
iex> MyApp.Cldr.Number.to_string 2017, format: :spellout_year
{:ok, "twenty seventeen"}
- As an ordinal. For example, formatting 123 into “123rd”. The applicable format types are
:ordinal,:spellout_ordinaland:spellout_ordinal_verbose.
iex> MyApp.Cldr.Number.to_string 123, format: :ordinal
{:ok, "123rd"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout_ordinal
{:ok, "one hundred twenty-third"}
iex> MyApp.Cldr.Number.to_string 123, format: :spellout_ordinal_verbose
{:ok, "one hundred and twenty-third"}
iex> MyApp.Cldr.Number.to_string 123, format: :ordinal, locale: "fr"
{:ok, "123e"}
iex> MyApp.Cldr.Number.to_string 123, format: :ordinal, locale: "zh"
{:ok, "第123"}
- As Roman numerals. For example, formatting 123 into “CXXIII”. The applicable formats are
:romanor:roman_lower. Note that roman number formatting is only supported for numbers between 1 and 5,000.
iex> MyApp.Cldr.Number.to_string 123, format: :roman
{:ok, "CXXIII"}
iex> MyApp.Cldr.Number.to_string 123, format: :roman_lower
{:ok, "cxxiii"}
iex> MyApp.Cldr.Number.to_string 12345, format: :roman_lower
{:ok, "12,345"}
Also Liked
dimitarvp
I keep being impressed by the high quality of your work. Extremely well done.
aenglisc
kip
@joaquinalcerro, not all locales have the same RBNF (rules based number formats) rules. That’s why it’s important to check first what rules are available. For :es:
iex> Cldr.Rbnf.rule_names_for_locale :en
{:ok,
[:spellout_ordinal_verbose, :spellout_numbering_verbose,
:spellout_cardinal_verbose, :spellout_cardinal, :spellout_ordinal,
:spellout_numbering_year, :spellout_numbering, :digits_ordinal]}
As you can see there is no :spellout_cardinal but there are :spellout_cardinal_masculine and :spellout_cardinal_feminine. Lets try those:
iex> MyApp.Cldr.Number.to_string 123.456, format: :spellout_cardinal_masculine, locale: :es
{:ok, "ciento veintitrés punto cuatro cinco seis"}
iex> MyApp.Cldr.Number.to_string 123.456, format: :spellout_cardinal_feminine, locale: :es
{:ok, "ciento veintitrés punto cuatro cinco seis"}
Note: Requires the latest ex_cldr_numbers version 2.32.2.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









