在C#开发中,数值显示场景经常需要兼顾整数和小数两种情况,比如金额显示时,整数金额不需要显示小数点和零,而带小数的金额最多保留两位有效数字,避免无意义的尾随零出现。下面介绍几种常用的实现方式。

方法一:使用自定义格式字符串
自定义格式字符串中的#占位符表示如果该位置有有效数字则显示,没有则不显示,结合0占位符可以实现最多两位小数的效果。
using System;
class Program
{
static void Main()
{
double num1 = 12;
double num2 = 12.3;
double num3 = 12.345;
double num4 = 12.3456;
// 自定义格式:整数部分正常显示,小数部分最多两位,无有效数字则不显示
string result1 = num1.ToString("#.##");
string result2 = num2.ToString("#.##");
string result3 = num3.ToString("#.##");
string result4 = num4.ToString("#.##");
Console.WriteLine(result1); // 输出 12
Console.WriteLine(result2); // 输出 12.3
Console.WriteLine(result3); // 输出 12.35(默认四舍五入)
Console.WriteLine(result4); // 输出 12.35
}
}
格式说明
#:可选数字占位符,对应位置有非零数字时显示,否则不显示.:小数点占位符,分隔整数部分和小数部分#.##表示整数部分按实际显示,小数部分最多两位,不足两位不补零
方法二:使用标准格式字符串配合条件判断
如果需要更精确的控制,比如避免默认的四舍五入行为,可以先判断数值是否为整数,再选择不同的格式化方式。
using System;
class Program
{
static void Main()
{
double num1 = 12;
double num2 = 12.3;
double num3 = 12.345;
string FormatNumber(double num)
{
// 判断是否为整数(考虑浮点精度问题,用误差范围判断)
if (Math.Abs(num - Math.Round(num)) < 0.0000001)
{
return num.ToString("F0");
}
else
{
// 最多保留两位,截断而非四舍五入
double truncated = Math.Truncate(num * 100) / 100;
return truncated.ToString("F2").TrimEnd('0').TrimEnd('.');
}
}
Console.WriteLine(FormatNumber(num1)); // 输出 12
Console.WriteLine(FormatNumber(num2)); // 输出 12.3
Console.WriteLine(FormatNumber(num3)); // 输出 12.34
}
}
方法三:使用String.Format方法
String.Format方法同样支持自定义格式字符串,适合需要拼接其他内容的场景。
using System;
class Program
{
static void Main()
{
double price1 = 99;
double price2 = 99.9;
double price3 = 99.999;
string msg1 = String.Format("商品价格:{0:#.##}元", price1);
string msg2 = String.Format("商品价格:{0:#.##}元", price2);
string msg3 = String.Format("商品价格:{0:#.##}元", price3);
Console.WriteLine(msg1); // 输出 商品价格:99元
Console.WriteLine(msg2); // 输出 商品价格:99.9元
Console.WriteLine(msg3); // 输出 商品价格:100元(四舍五入)
}
}
不同方法的适用场景
| 方法 | 适用场景 | 注意事项 |
|---|---|---|
自定义格式字符串#.## | 简单场景,接受默认四舍五入规则 | 浮点精度问题可能导致判断整数不准确 |
| 条件判断+截断处理 | 需要严格控制小数位数,避免四舍五入 | 需要额外处理浮点精度误差 |
| String.Format配合格式字符串 | 需要拼接其他文本内容的场景 | 格式规则与ToString一致 |
注意事项
浮点类型(float、double)存在精度误差,判断数值是否为整数时,不要直接用等于号比较,建议使用误差范围判断,比如绝对值小于1e-6就认为相等。
如果是decimal类型,精度更高,判断整数时可以直接和Math.Round后的结果比较,不需要额外误差处理。
using System;
class Program
{
static void Main()
{
decimal num1 = 12.00m;
decimal num2 = 12.345m;
string FormatDecimal(decimal num)
{
if (num == Math.Round(num))
{
return num.ToString("F0");
}
else
{
return num.ToString("#.##");
}
}
Console.WriteLine(FormatDecimal(num1)); // 输出 12
Console.WriteLine(FormatDecimal(num2)); // 输出 12.35
}
}
C#字符串格式小数格式化ToString_格式化数值显示修改时间:2026-07-09 03:57:28