You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何将decimal转换为Google.Type.Money类型

C# Decimal 转 Google.Type.Money 解决方案

现有扩展方法说明

无需手动计算units和nanos的开箱即用方案是存在的:

  • 先安装NuGet包 Google.Cloud.Core
  • 引入命名空间 Google.Cloud.Core 后,直接调用decimal类型的ToMoney()扩展方法即可完成转换

示例代码:

using Google.Cloud.Core;
using Google.Type;

// 示例数值
decimal payAmount = 299.99m;
Money protoMoney = payAmount.ToMoney();
// 按需指定ISO 4217标准货币代码即可
protoMoney.CurrencyCode = "CNY";

自定义轻量扩展实现

如果你不想引入额外的第三方包,也可以自行实现扩展方法,逻辑如下:

using Google.Type;
using System;

public static class CustomMoneyExtensions
{
    public static Money ToMoney(this decimal value, string currencyCode = null)
    {
        // 取整数部分为units
        long units = (long)Math.Truncate(value);
        // 小数部分乘以1e9转换为nanos
        int nanos = (int)Math.Round((value - units) * 1_000_000_000);
        
        // 对齐负数场景下的nanos符号
        if (value < 0 && nanos > 0)
        {
            units -= 1;
            nanos -= 1_000_000_000;
        }

        return new Money
        {
            Units = units,
            Nanos = nanos,
            CurrencyCode = currencyCode
        };
    }
}

调用示例:

decimal amount = -123.45m;
Money money = amount.ToMoney("USD");

注意事项

  • 官方扩展方法不会自动赋值CurrencyCode属性,需要你根据业务场景手动传入ISO 4217标准的三位货币代码
  • 自定义实现时如果有极高精度要求,可以额外增加decimal的精度校验逻辑,避免超出Money类型的取值范围

内容的提问来源于stack exchange,提问作者NYCdotNet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:39:03