V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wheelg
V2EX  ›  问与答

记账软件的多币种到底该如何设计?

  •  
  •   wheelg · 15 小时 39 分钟前 · 1067 次点击

    起因是在 Cent 的 issues 中看到一个关于增加多币种的请求,一开始我只是认为这或许是一个值得改进的 Feature ,甚至在构建 Cent 之初我就已经隐隐察觉到账单的数据结构中应该有一个字段用于记录币种,但当初并不觉得这对 Cent 的设计会有何影响,只是觉得后续可以通过迭代改进来加上这个功能。但是当我切实把 Cent 的功能都完善之后,我发现支持多币种这个需求,可能并没有我想象中的那么“自洽”。

    这个困惑一直萦绕着我,于是我开始下载市面上其他的记账软件,想去看看它们对于多币种的处理方法。大多属记账软件似乎特意避开了多币种这一问题,它们像 Cent 一样只记录金额,而不关心币种。而另一些支持多币种的 App ,使用的方案却都让我感到不甚满意。

    以 [随手记] 为例,它支持多币种,实现的方式是在记账时直接将货币统一转换为默认货币,即通过查询汇率,实时地将每一笔支出转换为 RMB ,最终统计的时候,也只按照 RMB 的结果来进行统计,这样就避免了不同币种无法直接统计总支出的情况。这个方法十分简单,确实只需要加字段就可以解决,但是对于 Cent 来说,获取汇率依赖后端接口是一个极度不优雅的方式,因为 Cent 没有传统意义上的服务器,并且 Cent 的理念就是去服务器化,为了一个“特殊需求”而导致破坏这一理念,是 Cent 无法接受的。并且,即使是简单的使用,我也意识到了实时转换货币的不合理之处,首先是导入账单时,如果导入的是其他货币,那该如何处理汇率转换?因为货币的汇率是实时波动的,历史账单记录的金额很可能与导入时的汇率大相径庭,难道要基于历史的汇率去进行转换吗?这显然是不合理的。

    老牌记账软件 iCost 也是这个思路,这更令我感到疑惑,难道这真的是多币种设计的唯一思路吗?

    我开始思考几个涉及多币种的场景:

    1 ,出门旅游,使用非本国货币支付。这种场景最为常见,我想起之前去香港旅游的经历,如今在外支付的方式已经十分便捷,使用支付宝和微信支付时,显示的支付结果已经是转换后的货币,即 RMB ,因此记录时只需要按照支付结果记录最终金额即可,并不涉及汇率问题。

    2 ,长期在外,身上有多个币种的银行卡,每次支付时可能使用不同的卡片进行支付,支付结果显示的是卡对应的币种,不能直接换算。不过这种场景,我认为应该属于多账本功能,因为每个不同的币种其实都可以看作是一本账本,它们的本来就应该被分别记录在不同的账本里,这样账目才会更加清晰,统计支出时也会更有目的性。而 Cent 天然就支持多账本,似乎这样的场景已经能被覆盖了。

    我突然意识到了一件事,虽然 Cent 支持了多账本,但是账本直接并没有什么联动,每个账本都是完全独立的,这可能才是用户想要多币种的原因,因此我在 issue 中提出了这个想法,即 Cent 希望用户将不同的 [币种] 视为不同的 [账本] 来处理,每一个账本只允许一种货币,这样完全不会破坏原有的账本体系,然后再通过界面上的优化,让多账本能够像单一账本那样展示,这是我能想到的关于多币种的最好的处理方法。

    不过这样做也会有一些问题,就是新建一个账本,多人协作功能也需要重新邀请,有点繁琐,不过相比于其他做法,这种方式的侵入性也是最小的,想问下 V 友们使用记账软件的时候,对于多币种的需求到底是什么样的呢?

    22 条回复    2025-11-14 23:20:32 +08:00
    momocraft
        1
    momocraft  
       15 小时 29 分钟前
    Cent 没用过,简单看了下不是复式记账是吧

    我应该只需要能记录支出,收入,能平账(比如刷外币还人民币的信用卡账单)并记录可能的误差,有点分类统计

    如你所说,每笔交易实际适用的汇率是不定的,软件从别处下载汇率也不太可能精确
    wheelg
        2
    wheelg  
    OP
       15 小时 19 分钟前
    @momocraft ‘刷外币还人民币的信用卡账单’这点也是困扰我的一个点,例如今天支出$10 ,下个月应还¥70 ,汇率可能是会变的,那今天应该怎么记录呢?
    whitewash
        3
    whitewash  
       15 小时 11 分钟前
    试试同类软件,例如说薄荷记账怎么实现的,进用户群问开发者。
    shannwoo
        4
    shannwoo  
       15 小时 6 分钟前
    我作为用户,感觉 iCost 那种多币种处理方式就已经可以接受了。目前正使用的 [鲨鱼记账 PRO] 缺乏这个多币种记账功能,要是补上就好了。
    wheelg
        5
    wheelg  
    OP
       14 小时 59 分钟前
    @shannwoo icost 似乎不会考虑历史汇率的问题,所有的币种都统一使用固定汇率,例如去年记录一笔$10,今年记录一笔$20,最终统计的时候就是简单的( 10+20 ) * 固定汇率,感觉有点简单粗暴了
    momocraft
        6
    momocraft  
       14 小时 55 分钟前
    @wheelg 就记支出$10 ,还 70 ,这笔交易汇率 7 (因此汇率也可能是每笔不一样的)

    算支出的汇率需要连接还款记录,所以已经开始像复式记账了,花钱时美元支出~美元负债,还时人民币现金~美元负债
    marquina
        7
    marquina  
       14 小时 40 分钟前   ❤️ 1
    我用 beancount 比较多, 对多币种的支持比较好.
    单条记账记录里同时包含币种和数量, 然后再单独记录每个货币在不同时间点的转换价格.
    [境外和外币消费帐 | Beancount Magazine | Beancount 杂志]( https://quaily.com/beancount-magazine/p/overseas-and-foreign-currency-consumption-accounting)
    106npo
        8
    106npo  
       14 小时 36 分钟前
    不知道你这个多账本之间是否支持转账哦
    信用卡账单就是,消费日记账,还款日转账.但是要注意利率得允许用户手动指定.
    langhuishan
        9
    langhuishan  
       14 小时 3 分钟前
    每个币种单独记,分开合计。其中取一个币种为本位币,需要全部合计时候,按汇率折算成本位币。可以每次交易存一次对本位币的汇率。
    sillydaddy
        10
    sillydaddy  
       13 小时 57 分钟前   ❤️ 1
    OP 知道 BeanCount 吗,开源的记账软件,采用的是复式记账。

    BeanCount 会记录下交易时的汇率。BeanCount 是复式记账,涉及到多币种时,可以非常好的处理:

    20xx-xx-xx * "积存金买入;xx 银行"
    Assets:Card:建设银行 XX 账户 -1056.76 CNY
    Assets:Investment:黄金:建行积存金 2.0 GOLD {528.38 CNY, "建行积存金"}

    20xx-xx-xx * "售汇;售汇 USD/CNY;xx 账户"
    Assets:Card:建设银行 XX 账户 -67.21 CNY
    Assets:Investment:外汇美元 10 USD {6.721 CNY, "测试购汇"}


    复式记账可以很好处理的根源,是因为一般记账软件只是记录“收入”和“支出”,这些记录的都是记账人这一侧的信息,像处理“记账人转账给自己”就很难处理了,或者认为不用处理,因为这既不是收入也不是支出。复式记账是同时记录一次交易的两侧(不仅是账户,还包括金额),这样无论是自己给别人交易(收入、支出),还是自己跟自己交易(自转账、换汇、投资),都能很好的处理。
    CoderGeek
        11
    CoderGeek  
       13 小时 33 分钟前
    交易时存汇率 或者 5 分钟一次刷新汇率 要存的 可以设置支持货币定期去银行 API 拉存下来
    ckizey
        12
    ckizey  
       13 小时 28 分钟前
    我的软件可能满足你的需求,录入外币会根据当前汇率转换为主货币,数据记录会保存主货币和外币的金额以及汇率,账单列表你会看到外币金额以及等值的主货币金额。如果用户更换主货币,账单金额会自动转换为新的主货币。另外一个点就是,市面上的 app 对多货币支持弱的原因主要是用的 Apple 的 Core Data 或者 Swift Data ,是 SQLite ,很多功能比如统计汇总、多货币转换是不能完善支持的,这个得靠服务端跑任务支持。我的 app 功能还没做全,就没推广,有这个需求的可以尝试一下,名字叫 Billr ,中文名 币乐,先亮一下相: https://apps.apple.com/us/app/%E5%B8%81%E4%B9%90-%E7%AE%80%E6%98%93%E8%AE%B0%E8%B4%A6%E5%92%8C%E9%A2%84%E7%AE%97%E8%A7%84%E5%88%92/id6751168643?l=zh-Hans-CN

    试问下,op 是 cent 作者吗
    unused
        13
    unused  
       12 小时 57 分钟前
    分多个账户,账户间支持以指定汇率换汇的操作,提供以实时汇率本币显示的视图。
    blubzz
        14
    blubzz  
       12 小时 41 分钟前
    账本币种、本位币汇总
    yuwangG
        15
    yuwangG  
       12 小时 40 分钟前
    是不是每个程序员都喜欢搞一个记账本啊
    luojianxhlxt
        16
    luojianxhlxt  
       12 小时 31 分钟前
    涉及到外汇,你就是不能平账的

    因为有的信用卡以交易日汇率给你记账
    有的信用卡以记账日汇率给你记账
    有的信用卡以账单日汇率给你记账

    我其实比较认的方式就是,一个账户有一个货币属性,任何其他币种的记账都转换为该币种

    涉及到的磨损等,只能让记账人自己去平账
    wheelg
        17
    wheelg  
    OP
       11 小时 59 分钟前
    @sillydaddy 了解过 beancount ,也大概知道复式记账,感觉其实复试记账就有点类似于目前 cent 多账本的概念,不同币种视为不同的账本
    wheelg
        18
    wheelg  
    OP
       11 小时 56 分钟前
    @ckizey cent 是我写的,目前就是头疼汇率问题,纯网页很容易被跨域问题卡住,请求 api 必须靠服务器代理,破坏了 Cent 的纯本地性,不像 app 可以随意发起请求
    ckizey
        19
    ckizey  
       11 小时 44 分钟前
    @wheelg 实时汇率靠服务端支持的
    NewMoorj
        20
    NewMoorj  
       5 小时 33 分钟前 via Android
    把货币当成货物,用进销存的思路
    NewMoorj
        21
    NewMoorj  
       5 小时 32 分钟前 via Android
    然后对货币(货物)频繁自动调整库存成本,外面只显示所产生的增益和损益
    usn
        22
    usn  
    PRO
       2 小时 56 分钟前
    联网实时换算货币汇率,总览用单种法币计算
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1068 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:17 · PVG 02:17 · LAX 10:17 · JFK 13:17
    ♥ Do have faith in what you're doing.