在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
相关产品推荐
相关产品推荐

