Packages

ex_cldr

0.0.3
2.47.5 2.47.4 2.47.3 2.47.2 2.47.1 2.47.0 2.46.0 2.45.2 2.45.1 2.45.0 2.44.1 2.44.0 2.43.2 2.43.1 2.43.0 2.42.0 2.41.1 2.41.0 2.40.4 2.40.3 2.40.2 2.40.1 2.40.0 2.39.2 2.39.1 2.39.0 2.38.1 2.38.0 2.37.5 2.37.4 2.37.3 retired 2.37.2 2.37.1 2.37.0 2.36.0 2.35.1 2.35.0 retired 2.34.2 2.34.1 2.34.0 2.33.2 2.33.1 2.33.1-rc.0 2.33.0 2.32.1 2.32.0 2.31.0 2.30.0 2.29.0 2.28.0 2.27.1 2.27.0 retired 2.26.3 2.26.2 2.26.1 2.26.0 2.25.0 2.24.2 2.24.1 2.24.0 2.24.0-rc.6 2.24.0-rc.5 2.24.0-rc.4 2.24.0-rc.3 2.24.0-rc.2 2.24.0-rc.1 2.24.0-rc.0 2.23.2 2.23.1 2.23.0 2.22.1 2.22.0 2.21.0 2.20.0 2.20.0-rc.3 2.20.0-rc.2 2.20.0-rc.1 2.20.0-rc.0 2.19.1 2.19.0 2.18.2 2.18.1 2.18.0 2.18.0-rc.0 2.17.2 2.17.1 2.17.0 2.16.2 2.16.1 2.16.1-rc.0 2.16.0 2.15.0 2.14.1 2.14.0 2.14.0-rc.0 2.13.0 2.12.1 2.12.0 2.11.1 2.11.0 2.10.2 2.10.1 2.10.0 retired 2.9.0 2.8.1 2.8.0 2.7.2 2.7.1 2.7.0 2.6.2 2.6.1 2.6.0 2.5.0 2.4.3 2.4.2 2.4.1 2.4.0 2.3.2 2.3.1 2.3.0 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.3 retired 2.0.0-rc.2 retired 2.0.0-rc.1 retired 2.0.0-rc.0 retired 1.8.2 1.8.1 1.8.0 1.7.1 1.7.0 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 retired 1.4.0-rc.3 retired 1.4.0-rc.2 retired 1.4.0-rc.1 retired 1.4.0-rc.0 retired 1.3.2 1.3.1 1.3.0 1.2.0 1.1.0 1.0.0 1.0.0-rc.3 retired 1.0.0-rc.2 retired 1.0.0-rc.1 retired 1.0.0-rc.0 retired 0.13.1 0.13.0 0.12.2 retired 0.12.1 retired 0.12.0 retired 0.11.0 retired 0.10.0 retired 0.9.0 retired 0.8.3 retired 0.8.2 retired 0.8.1 retired 0.8.0 retired 0.7.0 retired 0.6.2 retired 0.6.1 retired 0.6.0 retired 0.5.2 retired 0.5.1 retired 0.5.0 retired 0.4.2 retired 0.4.1 retired 0.4.0 retired 0.3.0 retired 0.2.1 retired 0.2.0 retired 0.1.3 retired 0.1.2 retired 0.1.1 retired 0.1.0 retired 0.0.20 retired 0.0.19 retired 0.0.18 retired 0.0.17 retired 0.0.16 retired 0.0.15 retired 0.0.14 retired 0.0.13 retired 0.0.12 retired 0.0.11 retired 0.0.10 retired 0.0.8 retired 0.0.7 retired 0.0.6 retired 0.0.5 retired 0.0.4 retired 0.0.3 retired

Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.

Retired package: Deprecated

Current section

Files

Jump to
ex_cldr bench scenarios number_int_digits.exs
Raw

bench/scenarios/number_int_digits.exs

defmodule Number.Int.Digits.Bench do
import Cldr.Number.Math, only: [log10: 1]
@doc """
Returns the number of decimal digits in the integer
part of a number.
`number` can be an `integer`. `Decimal` or `float`.
## Examples
iex(10)> Cldr.Number.Math.number_of_integer_digits(1234)
4
iex(11)> Cldr.Number.Math.number_of_integer_digits(Decimal.new("123456789"))
9
iex(15)> Cldr.Number.Math.number_of_integer_digits(1234.456)
4
"""
def number_of_integer_digits(%Decimal{exp: exp} = number) when exp < 0 do
number
|> Decimal.round(0, :floor)
|> Decimal.to_integer
|> number_of_integer_digits
end
# +/- 0,xxxxx
def number_of_integer_digits(number)
when is_number(number) and number < 1 and number > -1 do
0
end
def number_of_integer_digits(%Decimal{} = number) do
number
|> Decimal.to_integer
|> number_of_integer_digits
end
def number_of_integer_digits(number) when is_float(number) do
number
|> trunc
|> number_of_integer_digits
end
def number_of_integer_digits(number) when is_integer(number) do
Integer.digits(number)
|> Enum.count
end
# Repeated division by 10 solution
def number_of_integer_digits4(number) when is_integer(number) do
do_number_of_integer_digits(number, 0)
end
def number_of_integer_digits4(number) when is_float(number) do
number
|> trunc
|> do_number_of_integer_digits(0)
end
def number_of_integer_digits4(%Decimal{} = number) do
number
|> Decimal.round(0, :floor)
|> Decimal.to_integer
|> do_number_of_integer_digits(0)
end
defp do_number_of_integer_digits(number, count) when number == 0 do
count
end
defp do_number_of_integer_digits(number, count) do
number
|> div(10)
|> do_number_of_integer_digits(count + 1)
end
# floor(log10(number)) + 1 Method
def number_of_integer_digits2(%Decimal{} = number) do
number
|> log10
|> Decimal.round(0, :floor)
|> Decimal.to_integer
|> Kernel.+(1)
end
def number_of_integer_digits2(number) do
number
|> log10
|> Float.floor
|> Kernel.+(1)
end
# Division table method
@list [{10000000000000000, 16}, {100000000, 8}, {10000, 4}, {100, 2}, {10, 1}]
def number_of_integer_digits3(number) when number > 10000000000000000 do
raise ArgumentError, message: "Can't handle numbers that big!"
end
def number_of_integer_digits3(number) do
{_, num} = Enum.reduce @list, {number, 2}, fn {marker, add}, {int, digits} ->
if int > marker do
{int / marker, digits + add}
else
{int, digits}
end
end
num
end
end