如何使用CSVHelper将Decimal金额以货币格式写入CSV文件?
问题
我有一个代表金额的Decimal类型值,希望将其以货币格式写入CSV文件。当前使用的代码如下:
await using var writer = new StreamWriter(csvPath); await using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.Context.RegisterClassMap<MyClass>(); await csv.WriteRecordsAsync(data); };
在映射类中我做了如下配置:
Map(x => x.Amount).Name("amount") .TypeConverterOption.NumberStyles(NumberStyles.Currency);
但最终得到的结果仅是十进制数值“141000”,而非货币格式,请问如何在CSV文件中以货币格式显示该Decimal数值?
解决方案
你当前用的NumberStyles.Currency是用来解析货币格式输入的规则,不是格式化输出的配置,这就是生效失败的原因。要输出货币格式,需调整如下:
方法1:指定货币格式字符串
修改类映射配置,使用TypeConverterOption.Format传入标准货币格式符("C"为默认货币格式,"C2"表示强制保留两位小数):
Map(x => x.Amount).Name("amount") .TypeConverterOption.Format("C");
方法2:适配特定地区货币格式(可选)
如果需要输出对应地区的货币符号(如人民币¥、美元$),不要使用InvariantCulture,替换为目标文化信息。例如输出人民币格式:
await using (var csv = new CsvWriter(writer, new CultureInfo("zh-CN"))) { csv.Context.RegisterClassMap<MyClass>(); await csv.WriteRecordsAsync(data); };
配合映射中的Format("C")配置,最终会输出类似¥141,000.00的格式。
额外说明
- 用
InvariantCulture搭配"C"会输出通用货币格式,结果为¤141,000.00(¤是通用货币符号),适合不需要特定地区符号的场景。 - 若需自定义格式(比如仅保留整数和货币符号),可使用自定义格式字符串,例如
"¥#,##0"。
内容的提问来源于stack exchange,提问作者Anthony14
相关产品推荐
相关产品推荐

