
自定义货币与数字货币Elixir Money支持ISO 24165数字令牌实战【免费下载链接】moneyElixir implementation of Money with Currency项目地址: https://gitcode.com/gh_mirrors/money4/moneyElixir Money 是 Elixir 生态中专注于金额处理的开源库它同时支持 ISO 4217 法定货币、ISO 24165 数字令牌加密货币与自定义货币代码三类身份一个库就能统一建模法币、比特币和你公司内部的积分。本文将带你快速上手 Elixir Money 的 ISO 24165 数字令牌支持并演示两种自定义货币的注册方式。Elixir Money 支持的三类货币身份Money 的核心设计原则是任何 Money 结构都必须由金额 货币身份组成而货币身份有三类身份类型标准示例说明法定货币ISO 4217:USD、:CNY内置完整列表含历史货币数字令牌ISO 24165BTC、ETH加密货币标识符可自动补全自定义货币私有区间代码:QFF1、:XBT积分、会员币等应用内货币查看当前支持的清单Money.known_currencies() # 所有 ISO 4217 代码 Money.known_current_currencies() # 现行货币 Money.known_historic_currencies() # 历史货币启用 ISO 24165 数字令牌3 行代码创建比特币Money 通过可选的DigitalToken库实现 ISO 24165 支持——只要项目中加载了该库Money.new/2就会自动识别数字令牌动态检测逻辑见 lib/money.ex 中的maybe_token/1无需任何额外配置。# 直接用令牌代码创建数字货币 %Money{} Money.new(BTC, 100) %Money{} Money.new(ETH, 100) # 也支持 ISO 24165 中的自定义令牌标识符 %Money{} Money.new(4H95J0R2X, 100.234235)格式化输出时会自动补上令牌符号 Money.to_string(Money.new(BTC, 100.234235)) # {:ok, ₿100.234235}符号来源于DigitalToken.symbols/0找不到符号时会退回短名如Bitcoin。相关测试可参考 test/money_token_test.exs。 与法币不同数字令牌的输出采用符号 原始小数的简单拼接不做 CLDR 本地化分组避免改变加密货币数额的精确表示。注册自定义货币的两种方式方式一运行时注册适合开发调试、动态业务调用Money.Currency.new/2即时创建货币规格定义在 lib/money/currency.ex{:ok, currency} Money.Currency.new(:QFF1, name: Frequent Flyer Points, digits: 2, symbol: F$ ) Money.to_string(Money.new(:QFF1, 1234.5)) # {:ok, F$ 1,234.50}货币代码有严格的命名规则防止与 ISO 4217 冲突私有区间代码X开头共 3 位如:XBT、:XAU自定义代码4~10 位大写字母数字首字符必须是字母如:QFF1、:A1B2C32 位、11 位、数字开头、含连字符的代码都会被拒绝。方式二启动时配置推荐用于生产环境在 config/config.exs 中声明应用启动时由Money.Currency.Store自动注册config :ex_money, :custom_currencies, [ {:GOLD_COIN, [name: Gold Coin, digits: 4, symbol: G$]}, {:MEMBER_PT, [name: Member Points, digits: 0]} ]这种方式的优势在于Store 每次启动包括 Supervisor 重启都会重新注册配置中的货币崩溃恢复后货币定义不会丢失而运行时用new/2添加的货币则不会在重启后保留。Store 基于:persistent_term实现读取路径零开销源码见 lib/money/currency/store.ex。若运行期修改了:custom_currencies配置可调用Money.Application.register_custom_currencies()见 lib/money/application.ex手动重新应用失败的条目只记录警告日志不会让应用崩溃。幕后机制校验顺序与格式化规则Money.validate_currency/2按固定优先级解析货币代码这也是自定义货币能与 ISO 代码共存而不打架的原因已知ISO 4217代码 → 直接通过运行时自定义货币存储Store中已注册 → 通过:custom_currencies配置中声明编译期也可识别→ 通过以上都不是 → 交给DigitalToken.validate_token/2尝试作为ISO 24165 数字令牌。格式化时自定义货币会直接使用注册的symbol和digits例如 4 位小数的积分会输出G$ 1.2346ISO 货币则走 Localize 的 CLDR 本地化规则自动套用货币的小数位与舍入增量如瑞士法郎的 0.05 现金最小单位。实战提示3 个常见坑小写代码会自动规范化Money.new(:qff1, 100)会被规整为:QFF1无需纠结大小写:name是必填项创建自定义货币时漏掉:name会返回InvalidCurrencyError重复注册会报错重复定义同一代码返回CurrencyAlreadyDefinedError与 ISO 代码冲突如试图注册:USD同样会被拒绝。小结Elixir Money 用统一的数据模型同时覆盖了ISO 4217 法币、ISO 24165 数字令牌与自定义货币比特币余额、法币订单、会员积分可以在同一个金额体系里安全运算与格式化。数字令牌开箱即用接入 DigitalToken 库即可自定义货币则建议通过:custom_currencies配置在启动时注册以获得崩溃恢复后的持久能力。更多细节可参阅 README.md 与自定义货币测试 test/custom_currency_test.exs。【免费下载链接】moneyElixir implementation of Money with Currency项目地址: https://gitcode.com/gh_mirrors/money4/money创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考