C#格式化输出
上两期:
C#格式化输出-CSDN博客
C#格式化输出-CSDN博客
Console.WriteLine和Console.Write
Console.WriteLine
和 Console.Write
是两个用于向控制台输出信息的方法,它们都属于 System.Console
类。尽管这两个方法的功能相似,但它们之间存在一些关键的区别,这些区别影响了它们的使用场景和行为。
Console.WriteLine方法:
Console.WriteLine
方法用于将指定的数据(字符串和数值或其他对象)及其后的唤醒符写入到控制台窗口,这意味着每次在调用Console.WriteLine
之后,光标会自动移到到下一行的开始位置,为接下来的输出准备好所需空间。因此当需要连续调用Console.Writeline
方式时,每一行输出都会出现在新的一行上面。
Console.Write方法:
Console.Write
方法同样可以接受各种类型的参数,并将它们转换长字符串后输出到控制台,但时它不会再输出结束之后添加换行符。如需要换行就必须手动添加换行符(\r\n)。
格式化输出
除了基本的输出功能外,Console.WriteLine
和 Console.Write
都支持通过复合格式字符串来进行复杂的格式化操作。您可以指定占位符 {}
来表示待插入的参数,并且可以在大括号内定义格式化选项,如对齐方式、宽度限制以及特定类型的格式化模式。
double value = 123.456;
Console.WriteLine("Formatted number: {0:N2}", value); // 输出带两位小数的数字
Console.Write("Left aligned: {0,-10} | Right aligned: {1,10}\n", "left", "right");
性能考虑
理论上讲,由于 Console.WriteLine
每次调用时都需要处理换行符,因此它可能会比 Console.Write
略微消耗更多的资源。然而,在大多数实际应用中,这种差异是可以忽略不计的,除非是在极端情况下频繁调用这些方法。因此,选择哪个方法更多取决于具体的输出需求而非性能考量。
结论
Console.WriteLine
和 Console.Write
的主要区别在于是否自动添加换行符以及它们各自适用的不同输出场景。
标准与自定义是说明符
对于数字类型可以使用多种标准格式说明回复来改变其显示形式,如货币(c)、科学计数法(E)、固定点(F)等;而对于日期时间类型,则有短时期(d)、长日期(D)等不同格式;还可以通过自定义格式字符串来满足更为复杂的需要:
-
数字格式化:
-
货币:
2.5.ToString("C")
结果为2.50
-
十进制数:
25.ToString("D5")
结果为00025
-
科学型:
25000.ToString("E")
结果为2.500000E+005
-
固定点:
25.ToString("F2")
结果为25.00
-
常规:
2.5.ToString("G")
结果为2.5
-
数字:
2500000.ToString("N")
结果为2,500,000.00
-
十六进制:
255.ToString("X")
结果为FF
-
-
日期时间格式化:
-
短日期:
DateTime.Now.ToString("d")
-
长日期:
DateTime.Now.ToString("D")
-
完整日期和时间:
DateTime.Now.ToString("f")
-
RFC1123 日期字符串:
DateTime.Now.ToString("r")
-
可排序日期字符串:
DateTime.Now.ToString("s")
-
标准格式说明符
标准格式说明符时由单个字母字符组成的简单字符串,用于指定常见的数值或日期时间格式。例如:“c”
表示货币格式,“D”
表示十进制整数格式,而“F”
则表示固定点数格式。
每种说明符都有其默认的行为,并且可以根据据需要通过附加精度说明符来调整。
double value = 1234.5678;
Console.WriteLine(value.ToString("C")); // 货币格式,默认为当前文化设置下的货币符号
Console.WriteLine(value.ToString("F2")); // 固定点数格式,保留两位小数
这里展示了如何利用标准格式说明符快速地将数值转换成符合预期格式的字符串表示形式。对于日期时间类型的数据,也有类似的标准格式说明符,如 "d"
表示短日期模式,"t"
表示短时间模式等。
自定义格式说明符
当标准格式说明符无法满足特定需要时,我们将可以选择创建自定义格式说明符;自定义说明符允许更加精细地控制输出格式,包括但不限于数字占位符("0"和"#")、分隔符("."和",")、百分比符号("%")以及其他特殊符号,因此,还可以定义多个部分以分别处理正数、负数和零值的不用显示规则。
符号 | 描述 |
---|---|
"0" | 作为零占位符,即使没有对应的数字也会显示零。 |
"#" | 仅当由实际数字时才会显示,否则为空。 |
"." | 用于设置小数点的位置。 |
"," | 既可以作为分割符也可以用来缩放数值。 |
"%" | 将数值乘以100并添加百分号。 |
"‰" | 将数值乘以1000并添加千分号 |
多部分格式
可以使用分号 ";"
来分隔不同的格式部分,以便根据数值的正负性选择适当的格式化方式。
string format = "#,##0.00;(#,##0.00);-";
Console.WriteLine((-1234.56).ToString(format)); // 输出: (1,234.56)
例子中,第一部分用于正数,第二部分用于负数(带括号),第三部分则专门针对零值。
实现自定义格式提供程序
如果现有的标准和自定义格式说明符依然不能覆盖现有问题,则可以通过实现IFormatProvider
和ICustomFormatter
接口来自动红衣整个格式化过程。
public class CustomNumberFormatter : IFormatProvider, ICustomFormatter {
public object GetFormat(Type formatType) {
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider) {
// 实现具体的格式化逻辑...
return "formatted string";
}
}
通过这种方式,不仅可以扩展 C# 内置的格式化能力,还能够确保应用程序中的数据始终按照一致且正确的格式呈现给用户。