Packages
ex_money
5.20.0
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/combinators.ex
defmodule Money.Combinators do
@moduledoc false
import NimbleParsec
# Whitespace as defined by Unicode set :Zs plus tab
# non-breaking-space is considered a separator, not whitespace
@whitespace [?\s, ?\t, 0x1680, 0x2000, 0x202F, 0x205F, 0x3000]
def whitespace do
repeat(empty(), utf8_char(@whitespace))
|> label("whitespace")
end
@separators [?., ?,, ?،, ?٫, ?、, ?︐, ?︑, ?﹐, ?﹑, ?,, ?、, ? , 0x00A0]
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(empty(), 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(empty(), [
ignore(minus())
|> concat(positive_number()),
positive_number()
|> ignore(minus())
])
|> reduce({List, :to_string, []})
|> map(:add_minus_sign)
|> label("negative number")
end
def number do
choice(empty(), [negative_number(), positive_number()])
|> reduce({List, :to_string, []})
|> unwrap_and_tag(:amount)
|> label("number")
end
@rtl [0x200F]
def rtl do
ignore(utf8_char(@rtl))
end
@invalid_chars @digits ++ @left_parens ++ @minus ++ @rtl
@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(empty(), [
optional(rtl())
|> concat(number())
|> ignore(optional(whitespace()))
|> optional(currency())
|> optional(rtl())
|> eos(),
optional(rtl())
|> optional(currency())
|> ignore(optional(whitespace()))
|> concat(number())
|> optional(rtl())
|> eos()
])
|> label("money with currency")
end
def accounting_format do
choice(empty(), [
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)
|> label("money with currency in accounting format")
end
end