Localize.Number.Format.Compiler (Localize v0.45.0)

Copy Markdown View Source

Compiles number format patterns into metadata for fast runtime interpretation.

Number format patterns like "#,##0.###" or "¤#,##0.00" are parsed using a leex/yecc lexer-parser and then analysed to extract formatting metadata (digit counts, grouping, rounding, etc.) into a Localize.Number.Format.Meta struct.

Summary

Functions

Compiles a number format definition into metadata.

Extracts metadata from a parsed format.

Same as format_to_metadata/1 but raises on error.

Returns a regex that can be used to split a number format or number string into integer, fraction, and exponent parts.

Parses a number format definition into a keyword list of positive and negative format elements.

Tokenizes a number format definition string.

Functions

compile(definition)

@spec compile(String.t()) ::
  {:ok, Localize.Number.Format.Meta.t()} | {:error, String.t()}

Compiles a number format definition into metadata.

Parses the format string, analyses it, and returns the metadata struct used to drive number formatting.

Arguments

  • definition is a number format pattern string.

Returns

  • {:ok, meta} where meta is a Localize.Number.Format.Meta.t().

  • {:error, reason} if parsing fails.

Examples

iex> {:ok, meta} = Localize.Number.Format.Compiler.compile("#,##0.###")
iex> meta.fractional_digits
%{min: 0, max: 3}
iex> meta.grouping
%{integer: %{first: 3, rest: 3}, fraction: %{first: 0, rest: 0}}

format_to_metadata(format)

@spec format_to_metadata(String.t() | Keyword.t()) ::
  {:ok, Localize.Number.Format.Meta.t()} | {:error, String.t()}

Extracts metadata from a parsed format.

Arguments

  • format is either a format pattern string or a parsed keyword list from parse/1.

Returns

  • {:ok, meta} where meta is a Localize.Number.Format.Meta.t().

Examples

iex> {:ok, meta} = Localize.Number.Format.Compiler.format_to_metadata("0.00")
iex> meta.fractional_digits
%{min: 2, max: 2}

format_to_metadata!(format)

@spec format_to_metadata!(String.t() | Keyword.t()) :: Localize.Number.Format.Meta.t()

Same as format_to_metadata/1 but raises on error.

Arguments

  • format is either a format pattern string or a parsed keyword list.

Returns

  • A Localize.Number.Format.Meta.t() struct.

Raises

Examples

iex> meta = Localize.Number.Format.Compiler.format_to_metadata!("#,##0.###")
iex> meta.integer_digits
%{min: 1, max: 0}

number_match_regex()

@spec number_match_regex() :: Regex.t()

Returns a regex that can be used to split a number format or number string into integer, fraction, and exponent parts.

Returns

  • A Regex.t/0 with the named captures integer, fraction, exponent_sign, and exponent_digits.

Examples

iex> regex = Localize.Number.Format.Compiler.number_match_regex()
iex> Regex.named_captures(regex, "1234.567")["fraction"]
"567"

parse(tokens)

@spec parse(String.t() | list()) :: {:ok, Keyword.t()} | {:error, term()}

Parses a number format definition into a keyword list of positive and negative format elements.

Arguments

  • definition is a number format pattern string or a list of tokens from tokenize/1.

Returns

  • {:ok, format} where format is a keyword list with :positive and :negative keys.

  • {:error, reason} if parsing fails.

Examples

iex> {:ok, parsed} = Localize.Number.Format.Compiler.parse("#,##0.###")
iex> parsed[:positive]
[format: "#,##0.###"]

tokenize(definition)

@spec tokenize(String.t()) :: {:ok, list(), integer()} | {:error, term(), integer()}

Tokenizes a number format definition string.

Arguments

  • definition is a number format pattern string.

Returns

  • {:ok, tokens, end_line} or an error tuple.

Examples

iex> Localize.Number.Format.Compiler.tokenize("0.00")
{:ok, [{:format, 1, ~c"0.00"}], 1}