erosson / number-suffix / NumberSuffix

Format numbers with fancy suffixes.

Formatting

format : Config -> Basics.Float -> String

Format numbers with fancy suffixes.

format standardConfig 12345 --> "12,345"

format standardConfig 1.23e10 --> "12.3 billion"

config : Config
config = { standardConfig | getSuffix = suffixStandardShort }
format config 1.23e10 --> "12.3B"

formatInt : Config -> Basics.Int -> String

Format integers with fancy suffixes. See format.

formatSigExp : Config -> Basics.Float -> Basics.Int -> String

Format a significand and an exponent.

formatSigExp standardConfig 12.345 3 --> "12,345"

formatSigExp standardConfig 1.23 10 --> "12.3 billion"

config : Config
config = { standardConfig | getSuffix = suffixStandardShort }
formatSigExp config 1.23 10 --> "12.3B"

Configuration


type alias Config =
{ getSuffix : Basics.Int -> String
, locale : Locale
, sigfigs : Basics.Int
, suffixDivisor : Basics.Int
, minSuffix : Basics.Float 
}

Configure how numbers are formatted.

getSuffix returns a suffix, given a digit count for the number. See the suffix functions below.

sigfigs is the number of significant figures shown.

Below minSuffix, a comma-separated number is shown instead of a suffixed number.

standardConfig : Config

Default formatting configuration.

By default, we use standard suffixes, US locale, 3 significant figures, thousands grouping (suffixDivisor=3), and show no suffixes for values below 100,000.

scientificConfig : Config

Scientific notation formatting configuration.

config : Config
config = scientificConfig

format config 1.0e3 --> "1,000"
format config 1.0e6 --> "1.00e6"
format config 1.0e7 --> "1.00e7"
format config 1.0e8 --> "1.00e8"
format config 1.0e9 --> "1.00e9"


type alias Locale =
FormatNumber.Locales.Locale

Format numbers differently based on the user's location and culture.

See cuducos/elm-format-number:FormatNumber.Locales.

This does not change the language suffixes are in, only the formatting of the numbers themselves. Consider this with a custom suffix list if you need complete internationalization.

import FormatNumber.Locales

spanishConfig : Config
spanishConfig = { standardConfig | locale = FormatNumber.Locales.spanishLocale }

format standardConfig 1234 --> "1,234"
format spanishConfig 1234 --> "1.234"

Suffix list configuration

You'll usually use one of the built-in suffix lists below, but you could write your own. Here's a modified scientific notation suffix generator:

suffixPow10 : Int -> String
suffixPow10 digits = " * 10 ^ " ++ String.fromInt digits

config : Config
config = { scientificConfig | getSuffix = suffixPow10 }

format config 1e6 --> "1.00 * 10 ^ 6"

suffixStandard : Basics.Int -> String

Standard suffixes.

config : Config
config = { standardConfig | getSuffix = suffixStandard }
-- `config = standardConfig` would work too; this is the default

format config 1e3 --> "1,000"
format config 1e5 --> "100 thousand"
format config 1e6 --> "1.00 million"
format config 1e9 --> "1.00 billion"
format config 1e12 --> "1.00 trillion"
format config 1e15 --> "1.00 quadrillion"

suffixStandardShort : Basics.Int -> String

Abbreviated standard suffixes.

config : Config
config = { standardConfig | getSuffix = suffixStandardShort }

format config 1e3 --> "1,000"
format config 1e5 --> "100K"
format config 1e6 --> "1.00M"
format config 1e9 --> "1.00B"
format config 1e12 --> "1.00T"
format config 1e15 --> "1.00Qa"

suffixEngineering : Basics.Int -> String

Engineering notation.

Unlike scientific notation, engineering notation numbers are always divisible by 3.

config : Config
config = { standardConfig | getSuffix = suffixEngineering }

format config 1e3 --> "1,000"
format config 1e5 --> "100E3"
format config 1e6 --> "1.00E6"
format config 1e7 --> "10.0E6"
format config 1e8 --> "100E6"
format config 1e9 --> "1.00E9"

suffixLongScale : Basics.Int -> String

Long-scale suffixes.

config : Config
config = { standardConfig | getSuffix = suffixLongScale }

format config 1e3 --> "1,000"
format config 1e5 --> "100 thousand"
format config 1e6 --> "1.00 million"
format config 1e9 --> "1.00 milliard"
format config 1e12 --> "1.00 billion"
format config 1e15 --> "1.00 billiard"

suffixLongScaleShort : Basics.Int -> String

Abbreviated long-scale suffixes.

config : Config
config = { standardConfig | getSuffix = suffixLongScaleShort }

format config 1e3 --> "1,000"
format config 1e5 --> "100K"
format config 1e6 --> "1.00M"
format config 1e9 --> "1.00Md"
format config 1e12 --> "1.00B"
format config 1e15 --> "1.00Bd"

suffixAlphabetic : Basics.Int -> String

Alphabetic suffixes.

config : Config
config = { standardConfig | getSuffix = suffixAlphabetic }

format config 1e3 --> "1,000"
format config 1e5 --> "100K"
format config 1e6 --> "1.00M"
format config 1e9 --> "1.00B"
format config 1e12 --> "1.00T"
format config 1e15 --> "1.00aa"
format config 1e18 --> "1.00ab"