Все расчеты ведутся в Double.
Для денежных операций заведен трейт AlmostMoney, для отделения денег от обычных числе заведены два кейс-класса Money и Number.
Сделать из числа Money можно также через постфикc .$
, сделать Number можно посфиксом .n
.
При попытке произвести невозможную операцию будет выкинут эксепшн.
При создании элемента формулы нужно обернуть значения в MoneyFormula(), либо для сокращения в F(). Передать внутрь можно как AlmostMoney, так и Double, который преобразуется в Number, если передать строку, её текст будет рассматриваться как именованный параметр формулы.
Как альтернатива создания формулы, можно к значениям AlmostMoney добавлять постфикс .mf
.
Для расчета формулы по конкретным значениям нужно передать в её метод apply список пар ("имя_параметра" -> AlmostMoney значение).
Пример использования:
import dsl.MoneyFormulaDsl._
//создать формулу
val example1 = F(23.$) * (F("w") + F(5))
println(example1) // $23.0 * (w + 5.0)
val res1 = example1("w" -> 2.n)
println(res1) // $161.0
//для удобство записи можно подключить дополнительные имплиситы
import dsl.MoneyFormulaDsl.ImplicitFormulaHelper._
val example2 = 23.$.mf * "w" / 4
println(example2) // $23.0 * w / 4.0
val res2 = example2("w" -> 2.n)
println(res2) // $11.5