跳转到内容

C Sharp 字符串格式化

来自代码酷

C#字符串格式化[编辑 | 编辑源代码]

字符串格式化是C#中处理文本数据的重要技术,它允许开发者以特定格式组合、插入或转换变量值到字符串中。本教程将详细介绍C#中的字符串格式化方法,包括传统方式和现代方式。

介绍[编辑 | 编辑源代码]

在C#中,字符串格式化主要有以下几种方式:

  • 复合格式化:使用 string.Format 或控制台输出方法
  • 插值字符串:C# 6.0引入的$""语法
  • ToString方法:对象自带的格式化能力

这些方法都遵循相似的格式规范,但语法和使用场景有所不同。

复合格式化[编辑 | 编辑源代码]

复合格式化使用格式项(format items)作为占位符,其基本语法为:

{index[,alignment][:formatString]}

基本示例[编辑 | 编辑源代码]

string name = "Alice";
int age = 25;
string formatted = string.Format("Name: {0}, Age: {1}", name, age);
Console.WriteLine(formatted);
// 输出: Name: Alice, Age: 25

对齐和格式[编辑 | 编辑源代码]

double price = 19.99;
Console.WriteLine("Price: {0,10:C2}", price);
// 输出: Price:    $19.99
// 解释: 10表示10字符宽度,C2表示货币格式带2位小数

字符串插值[编辑 | 编辑源代码]

C# 6.0引入的更简洁的语法:

string name = "Bob";
int score = 95;
Console.WriteLine($"Player: {name}, Score: {score:D3}");
// 输出: Player: Bob, Score: 095
// 解释: D3表示3位十进制数,不足补零

标准数字格式[编辑 | 编辑源代码]

常用数字格式说明符:

常用数字格式说明符
说明符 描述 示例 输出
货币 | 123.456 ("C2") | $123.46
十进制 | 42 ("D5") | 00042
科学计数法 | 1052.0329112756 ("E2") | 1.05E+003
定点数 | 1234.567 ("F2") | 1234.57
百分比 | 0.369 ("P1") | 36.9%

自定义格式[编辑 | 编辑源代码]

开发者可以定义自己的格式模式:

DateTime now = DateTime.Now;
Console.WriteLine($"Current time: {now:yyyy-MM-dd HH:mm:ss}");
// 输出示例: Current time: 2023-08-15 14:30:45

文化敏感性[编辑 | 编辑源代码]

格式化可以针对特定文化区域:

double value = 1234.56;
Console.WriteLine(value.ToString("C", new System.Globalization.CultureInfo("fr-FR")));
// 输出: 1 234,56 €

性能考虑[编辑 | 编辑源代码]

对于高性能场景,应考虑使用:

  • StringBuilder 用于大量字符串操作
  • 预编译格式字符串
  • 避免在循环中进行不必要的格式化

实际应用案例[编辑 | 编辑源代码]

报表生成[编辑 | 编辑源代码]

var products = new List<(string Name, decimal Price)>()
{
    ("Laptop", 999.99m),
    ("Mouse", 25.50m),
    ("Keyboard", 45.75m)
};

Console.WriteLine("{0,-15} {1,10}", "Product", "Price");
Console.WriteLine(new string('-', 26));
foreach (var item in products)
{
    Console.WriteLine("{0,-15} {1,10:C2}", item.Name, item.Price);
}
/* 输出:
Product              Price
--------------------------
Laptop             $999.99
Mouse               $25.50
Keyboard            $45.75
*/

日志记录[编辑 | 编辑源代码]

void Log(string message, DateTime timestamp, LogLevel level)
{
    Console.WriteLine($"[{level,-7}] {timestamp:yyyy-MM-dd HH:mm:ss.fff}: {message}");
}

Log("Application started", DateTime.Now, LogLevel.Info);
// 输出示例: [Info   ] 2023-08-15 14:30:45.123: Application started

高级主题[编辑 | 编辑源代码]

自定义格式化提供程序[编辑 | 编辑源代码]

实现 IFormatProviderICustomFormatter 接口:

public class CustomFormatter : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType) => formatType == typeof(ICustomFormatter) ? this : null;

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg is int i && format == "hex")
            return $"0x{i:X}";
        return arg.ToString();
    }
}

int number = 255;
Console.WriteLine(string.Format(new CustomFormatter(), "Hex value: {0:hex}", number));
// 输出: Hex value: 0xFF

总结[编辑 | 编辑源代码]

C#提供了多种强大的字符串格式化方式,从简单的值插入到复杂的文化敏感格式。选择合适的方法取决于:

  • 代码可读性需求
  • 性能要求
  • 本地化需求
  • 代码维护考虑

现代C#开发中,字符串插值通常是首选,但在需要复用格式字符串或更复杂控制时,复合格式化仍然很有价值。