Packages
ex_money
4.4.3
6.1.1
6.1.0
6.0.0
6.0.0-rc.0
5.24.2
5.24.1
5.24.0
retired
5.23.0
5.22.0
5.21.0
5.20.0
5.19.2
5.19.1
5.19.0
5.18.0
5.17.2
5.17.1
5.17.0
5.16.1
5.16.0
5.15.4
5.15.3
5.15.2
5.15.1
5.15.0
5.14.1
5.13.0
5.12.4
5.12.3
5.12.2
5.12.1
5.12.0
5.11.0
5.10.0
5.9.0
5.8.0
5.7.4
5.7.3
5.7.2
5.7.1
5.7.0
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.1
5.4.0
5.4.0-rc.0
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.0
5.0.2
5.0.1
5.0.0
retired
4.4.3
4.4.2
retired
4.4.1
4.4.0
4.3.0
4.2.2
4.2.1
4.2.0
4.1.0
4.0.0
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.1
3.3.0
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.0.0
2.12.2
2.12.1
retired
2.12.0
retired
2.11.0
2.10.0
2.9.1
2.9.0
2.8.0
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.0
2.3.0
2.2.2
2.2.1
2.2.0
2.1.0
2.1.0-rc.1
retired
2.1.0-rc.0
retired
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.3
1.1.2
1.1.1
retired
1.1.0
1.0.0
1.0.0-rc.0
retired
0.9.0
retired
0.8.5
retired
0.8.4
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.3
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.3
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
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.9
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
0.0.2
retired
Money functions for operations on and localization of a money data type with support for ISO 4217 currencies and ISO 24165 digial tokens (crypto currencies).
Current section
Files
Jump to
Current section
Files
lib/money/parser.ex
defmodule Money.Parser do
@moduledoc false
import NimbleParsec
@whitespace [?\s, ?\t]
def whitespace do
repeat(utf8_char(@whitespace))
|> label("whitespace")
end
@separators [?., ?,, ?،, ?٫, ?、, ?︐, ?︑, ?﹐, ?﹑, ?,, ?、, ? ]
def separators do
utf8_char(@separators)
|> label("separators")
end
@decimal_places [?., ?․, ?。, ?︒, ?﹒, ?., ?。]
def decimal_place do
utf8_char(@decimal_places)
|> label("decimal place character")
end
@left_parens [?(]
def left_paren do
utf8_char(@left_parens)
|> label("left parenthesis")
end
@right_parens [?)]
def right_paren do
utf8_char(@right_parens)
|> label("right parenthesis")
end
@digits [?0..?9]
def digits do
repeat(ascii_char([?0..?9]))
|> label("digits")
end
@minus [?-]
def minus do
ascii_char(@minus)
end
def positive_number do
digits()
|> repeat(separators() |> concat(digits()))
|> optional(decimal_place() |> concat(digits()))
|> label("positive number")
end
def negative_number do
choice([
ignore(minus())
|> concat(positive_number()),
positive_number()
|> ignore(minus())
])
|> reduce({List, :to_string, []})
|> map(:add_minus_sign)
|> label("negative number")
end
def add_minus_sign(arg) do
"-" <> arg
end
def number do
choice([negative_number(), positive_number()])
|> reduce({List, :to_string, []})
|> unwrap_and_tag(:amount)
|> label("number")
end
@invalid_chars @separators ++
@decimal_places ++
@digits ++
@minus ++
@left_parens ++
@right_parens
@currency Enum.map(@invalid_chars, fn s -> {:not, s} end)
def currency do
utf8_char(@currency)
|> times(min: 1)
|> reduce({List, :to_string, []})
|> unwrap_and_tag(:currency)
|> label("currency code, symbol or name")
end
def money_with_currency do
choice([
number()
|> ignore(optional(whitespace()))
|> optional(currency())
|> eos(),
optional(currency())
|> ignore(optional(whitespace()))
|> concat(number())
|> eos()
])
end
def accounting_format do
choice([
ignore(left_paren())
|> ignore(optional(whitespace()))
|> concat(number())
|> ignore(optional(whitespace()))
|> optional(currency())
|> ignore(optional(whitespace()))
|> ignore(right_paren()),
ignore(left_paren())
|> ignore(optional(whitespace()))
|> optional(currency())
|> ignore(optional(whitespace()))
|> concat(number())
|> ignore(optional(whitespace()))
|> ignore(right_paren())
])
|> map(:change_sign)
end
def change_sign({:amount, amount}) do
revised_number =
case amount do
<<"-", number::binary>> -> number
number -> "-" <> number
end
{:amount, revised_number}
end
def change_sign(other), do: other
end