4 个版本

0.3.2 2022 年 5 月 3 日
0.3.1 2022 年 5 月 2 日
0.3.0 2021 年 1 月 8 日
0.2.4 2021 年 1 月 3 日

#479 in 数学

MIT 许可证

68KB
1.5K SLoC

CostOf.Life

Build Coverage Status dependency status Crates.io

这是 CostOf.Life 库和命令行客户端。

有关项目的更详细介绍,请查看网站: thecostof.life

安装

使用 cargo install costoflife 安装它

示例

要添加单个交易,请使用命令 costoflife add

|> costoflife add Netflix 7.99100320 1m12x .movies .covid

看看实际效果

asciicast

交易

该库解析交易并计算每个交易的 每日金额。有关更详细的解释,请查看 CostOf.life 网站。

交易属性

  • 名称:描述性名称
  • 金额:货币金额
  • 使用寿命:交易适用的持续时间
  • 开始日期:从何时开始计算使用寿命的日期
  • 标签:用于分组交易

作为简单的接口,库将字符串解析为交易,字符串的格式在示例中显示,详细信息如下。

解析规则

库将输入字符串标记化并查找以下列表中的模式。任何无法识别为模式的都将设置为交易的标题。标题是 必需的

金额

交易的货币价值,必需

Amount ::= Natural ( '.' Digit Digit? )? "" 

Natural ::= NaturalDigit Digit*
NaturalDigit ::= #'[1-9]'
Digit ::= "0" | NaturalDigit 

目前唯一可用的货币是

示例

  • 10
  • 10000.99

使用寿命

交易的持续时间,可选,默认为 1d

Lifetime ::= Duration Repeat?

Duration ::= Natural TimeUnit
Repeat ::= Natural "x"
TimeUnit ::= "d" | "w" | "m" | "y"

其中 TimeUnit

  • d
  • w
  • m
  • y

示例

  • 1m12x => 一个月重复 12 次,例如用于每月订阅(Netflix 等)
  • 12m => 一次 12 个月,等同于 1y
  • 1w52x => 一周52次,例如全年的每周杂货支出

💡 重复次数会影响交易总额:10€ 1m12x 将产生总额为 120 的交易,而 12m1x 将在12个月内产生总额为 10 的单次交易

开始日期

交易开始日期,可选,默认为当前日期,使用小端格式(日,月,年)。

Date ::= Day Month Year

Month ::= "1" #'[0-2]' | "0" NaturalDigit
Day ::= '0' #'[1-9]' | #'[1-2]' Digit | '3' #'[0-1]'
Year ::= Digit Digit

Natural ::= NaturalDigit Digit*
NaturalDigit ::= #'[1-9]'
Digit ::= "0" | NaturalDigit 

示例

  • 030521 => 2021年3月3日
  • 312122 => 2022年12月31日

标签

用于标记交易,可选。为了方便,使用哈希标签格式。

HashTag ::=  ('#' | '.')  Word

EOL ::= '\r'? '\n' 
Word ::= AlphaNum+ [ (' ' | '\t')+ | EOL ]
AlphaNum  ::= #'[A-Za-z0-9_-]'

示例

  • #生活方式
  • .任何东西

附录

这里列出了完整的语法


Tx ::= ( Amount | Lifetime | StartDate | HashTag ) ( SEP ( Amount | Lifetime | StartDate | HashTag )  )+ EOL

EOL ::= '\r'? '\n' 
SEP ::= (' ' | '\t')+

Lifetime ::= Duration Repeat?

Duration ::= Natural TimeUnit
Repeat ::= Natural "x"
TimeUnit ::= "d" | "w" | "m" | "y"

StartDate ::= Day Month Year

Month ::= "1" #'[0-2]' | "0" NaturalDigit
Day ::= '0' #'[1-9]' | #'[1-2]' Digit | '3' #'[0-1]'
Year ::= Digit Digit

Amount ::= Natural ( '.' Digit Digit? )? "" 

Natural ::= NaturalDigit Digit*
NaturalDigit ::= #'[1-9]'
Digit ::= "0" | NaturalDigit 
Int ::= "+" | "-" Digit+

HashTag ::=  ('#' | '.')  Word

Word ::= AlphaNum+
AlphaNum  ::= #'[A-Za-z0-9_-]'

adgb 制作

技术设置

  1. 安装 rust
  2. 安装 cargo-edit: cargo install cargo-edit。Cargo edit 用于管理依赖项。
  3. 安装 cargo-bump: cargo install cargo-bump。Cargo bump 用于增加版本。

依赖项

~8–18MB
~232K SLoC