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
@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
definitionis a number format pattern string.
Returns
{:ok, meta}wheremetais aLocalize.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}}
@spec format_to_metadata(String.t() | Keyword.t()) :: {:ok, Localize.Number.Format.Meta.t()} | {:error, String.t()}
Extracts metadata from a parsed format.
Arguments
formatis either a format pattern string or a parsed keyword list fromparse/1.
Returns
{:ok, meta}wheremetais aLocalize.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}
@spec format_to_metadata!(String.t() | Keyword.t()) :: Localize.Number.Format.Meta.t()
Same as format_to_metadata/1 but raises on error.
Arguments
formatis either a format pattern string or a parsed keyword list.
Returns
- A
Localize.Number.Format.Meta.t()struct.
Raises
- Raises
ArgumentErrorif the format cannot be parsed.
Examples
iex> meta = Localize.Number.Format.Compiler.format_to_metadata!("#,##0.###")
iex> meta.integer_digits
%{min: 1, max: 0}
@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/0with the named capturesinteger,fraction,exponent_sign, andexponent_digits.
Examples
iex> regex = Localize.Number.Format.Compiler.number_match_regex()
iex> Regex.named_captures(regex, "1234.567")["fraction"]
"567"
Parses a number format definition into a keyword list of positive and negative format elements.
Arguments
definitionis a number format pattern string or a list of tokens fromtokenize/1.
Returns
{:ok, format}whereformatis a keyword list with:positiveand:negativekeys.{:error, reason}if parsing fails.
Examples
iex> {:ok, parsed} = Localize.Number.Format.Compiler.parse("#,##0.###")
iex> parsed[:positive]
[format: "#,##0.###"]
Tokenizes a number format definition string.
Arguments
definitionis 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}