tostring("c")可直接生成带符号货币字符串,自动适配当前文化设置;注意大小写敏感、decimal精度、currencypositivepattern控制符号位置、“cn”小数位受文化约束,web场景应在视图层格式化。

用 ToString("C") 最快得到带符号的货币字符串
直接调用数字的 ToString("C") 就行,不用拼接符号、不用查区域设置表。它会自动根据当前线程的 CultureInfo 插入对应的钱符号(比如 $、¥、€)和千分位分隔符。
常见错误是写成 ToString("c")(小写 c)——这会抛出 FormatException,因为标准格式说明符区分大小写。
-
12345.67m.ToString("C")→"$12,345.67"(美国文化下) -
12345.67m.ToString("C", new CultureInfo("ja-JP"))→"¥12,346"(四舍五入到整数,日元无小数) - 推荐始终用
decimal类型处理金钱,避免float或double的精度误差
钱符号位置不对?检查 CultureInfo 和 NumberFormatInfo.CurrencyPositivePattern
有些地区把符号放在数字后面(如 “12 345,67 €”),不是你想要的 “€12 345,67”。这不是 bug,是当地习惯。想强制前置,得手动配置格式器。
- 默认行为由当前线程的
CultureInfo.CurrentCulture决定 - 改显示顺序不能只换格式字符串,得新建
NumberFormatInfo并修改CurrencyPositivePattern(值为 0 = 符号前,1 = 符号后,2 = 符号在中间等) - 注意:修改
NumberFormatInfo后必须传给ToString的第二个参数,否则无效 - 示例:
var nfi = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); nfi.CurrencyPositivePattern = 0; 12345.67m.ToString("C", nfi); // 强制符号在前
"C2" 和 "C0" 控制小数位数,但受文化规则约束
"C" 默认显示两位小数,"C0" 显示零位,"C3" 显示三位……但某些货币(如日元、韩元)本身不使用小数,即使你写 "C2",最终也会被截断为整数。
-
123.456m.ToString("C2")→"$123.46"(四舍五入) -
123.456m.ToString("C0")→"$123" - 对
ja-JP文化,123.456m.ToString("C2")仍输出"¥123",不会出现.46 - 如果业务要求统一显示两位小数(比如报表导出),别依赖
"C2",改用"C"+ 自定义NumberFormatInfo.CurrencyDecimalDigits = 2
Web API 或跨服务场景下,"C" 格式容易出错
ASP.NET Core API 默认序列化时不会调用 ToString("C"),返回的是原始数字;前端 JS 解析时更不认识 "$123.45" 这种字符串——它既不是数字也不是标准 JSON 格式。
- 不要在 DTO 模型里用
string字段存ToString("C")结果,破坏数据语义 - 需要展示时,格式化逻辑应放在视图层(Razor / Blazor)、前端(Intl.NumberFormat)或 API 的 ViewModel 层
- 若必须返回格式化后字符串,字段命名要明确,例如
FormattedPrice,而不是Price - 特别注意:JSON 序列化器(如 System.Text.Json)默认忽略
ToString重载,不会自动触发格式化











