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
高级主题[编辑 | 编辑源代码]
自定义格式化提供程序[编辑 | 编辑源代码]
实现 IFormatProvider
和 ICustomFormatter
接口:
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#开发中,字符串插值通常是首选,但在需要复用格式字符串或更复杂控制时,复合格式化仍然很有价值。