C#中的字符串格式化详解
在日常使用中,对于字符串的格式化这块也仅止步于能用就行。如日期格式化,小数点格式化等。
有时在MSDN上查看一些示例代码时,会看到一些没有见过的字符串格式化输出,这里做个详细的总结,
以后需要用时,直接到这里来看就好了。
说明:本文全部以字符串内插(C# 6.0)的形式实现,而不是使用String.Format()函数。
首先我们了解一下字符串内插的基本使用:
在字符串前使用$符号,然后在{}中直接使用表达式,像下面这样
1 {<interpolationExpression>}
测试代码:
1 int age = 18; 2 float weight = 50; 3 Console.WriteLine($"Age : {age} Y"); 4 Console.WriteLine($"Weight : {weight} KG");
输出 :
Age : 18 Y
Weight : 50 KG
如何指定格式字符串:
在表达式后加:号,然后输入格式字符串,像下面这样
1 {<interpolationExpression>:<formatString>}
测试代码:
1 var now = DateTime.Now; 2 Console.WriteLine($"{now:yyyy年MM月dd日 HH时:mm分:ss秒:ffff毫秒}");
输出
2023年06月21日 10时:02分:53秒:3104毫秒
如何设置字段宽度和对齐方式
在表达式后加,号,然后输入输入字段的宽度。如果输入的是正值,则是右对齐。反之左对齐。
像下面这样
1 {<interpolationExpression>,<alignment>}
测试代码:
1 var triangle = "Triangle"; 2 var circle = "Circle"; 3 4 Console.WriteLine($"Shape left align :{triangle,-20}|{circle,-20}"); 5 Console.WriteLine($"Shape right align :{triangle,20}|{circle,20}"); 6 Console.WriteLine($"Shape custom align :{triangle,20}|{circle,-20}");
输出:
转义
如果需要忽略转义字符,可以使用@符号,在$前面或后面加@符号都是有效的。
像下面这样:
1 @${interpolationExpression}
1 $@{interpolationExpression}
如果需要显示{,输入两个{即可
测试代码:
1 var fileName = "ConsoleApp2.exe"; 2 var path = $"D:\\{fileName}"; 3 var path2 = $@"D:\{fileName}"; 4 Console.WriteLine($"FilePath1:{{{path}}}"); 5 Console.WriteLine($"FilePath2:{{{path2}}}");
输出结果:
如何使用条件运算符
将表达式放在()里包围起来
像下面这样
1 {(expression)}
测试代码:
1 var sex = 0; 2 Console.WriteLine($"{(sex == 0 ? "Male" : "Female")}"); 3 string? value = null; 4 Console.WriteLine($"Input value is {(value ?? "HelloWorld(default)")}");
运行结果:
如何创建区域特性的字符串
默认情况下,字符串内插会使用CultureInfo.CurrentCulture 属性定义的当前区域性用于所有格式设置操作。
如果需要使用其它区域的设置来进行字符串格式化操作, 可以使用内插字符串到 System.FormattableString 实例的隐式转换,然后调用它的 ToString(IFormatProvider) 方法。
测试代码:
1 FormattableString formattableString = $"{now}"; 2 //当前区域(默认) 3 var currentCulture = CultureInfo.CurrentCulture; 4 var currentCultureMessage = formattableString.ToString(); 5 //en-US 6 var enUsCulture = CultureInfo.GetCultureInfo("en-US"); 7 var enUsMessage = formattableString.ToString(enUsCulture); 8 Console.WriteLine($"Current culture({currentCulture.DisplayName}):{currentCultureMessage}"); 9 Console.WriteLine($"en-US culture({enUsCulture.DisplayName}):{enUsMessage}");
运行结果:
字符串内插的基础使用就这些。
下面开始进入正题,如何通过不同的格式字符串来进行格式化。
注意:这些格式化的方式不仅仅适用于字符串内插,它还适用于
- String.Format,
- StringBuilder.AppendFormat,
- Console.WriteLine 某些重载
- TextWriter.WriteLine 某些重载
- Debug.WriteLine(String, Object[]),
- Trace.TraceError(String, Object[])、Trace.TraceInformation(String, Object[]) 和 Trace.TraceWarning(String, Object[])
- TraceSource.TraceInformation(String, Object[])
日期格式化:
日期这里只需要掌握核心的日期和时间格式字符串就可以应对所有场景的使用
yyyy | 四位数字表示的年份 如2013 |
MM | 两位数月份,不足两位时补0 如01、11 |
M | 一位数月份 如1、12 |
dd | 一个月中的某一天(两位数) |
d | 一个月中的某一天(一位数) |
ddd | 一周中某天的缩写名称 如 周一 |
dddd | 一周中某天的完整名称 如星期一 |
hh | 采用 12 小时制的小时(两位数) |
h | 采用 12 小时制的小时(一位数) |
HH | 采用 24 小时制的小时(两位数) |
H | 采用 24小时制的小时(一位数) |
mm | 分钟(两位数) |
m | 分钟(一位数) |
ss | 秒(两位数) |
s | 秒(一位数) |
fff | 毫秒 |
ff | 厘秒 |
f | 分秒 |
K | 时区 |
tt | AM/PM 指示符 |
注意:
因为标准日期和时间格式化字符串和自定义格式化的字符串有冲突,
所以如果要将任何自定义日期和时间格式说明符作为格式字符串中的唯一说明符使用(即若要使用“d”、“f”、“F”、“g”、“h”、“H”、“K”、“m”、“M”、“s”、“t”、“y”、“z”、“:”或“/”自定义格式说明符自身),
请在该说明符之前或之后添加一个空格,或在单个自定义日期和时间说明符之前包括一个百分号(“%”)格式说明符。
格式输出 一个完整的时间
1 var now = DateTime.Now; 2 Console.WriteLine($"{now:yyyy年MM月dd日 HH:mm:ss:fff dddd K}");
运行结果
标准日期和时间格式字符串这里就不做详细介绍了,可以自行阅读MSDN文档。因为掌握上面的格式串就可以得到自己想要的所有格式时间
如 “G"可以输出长时间
1 var now = DateTime.Now; 2 Console.WriteLine($"{now:G}");
运行结果
参考资料:
自定义日期和时间格式字符串
https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/custom-date-and-time-format-strings
标准日期和时间格式字符串
https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-date-and-time-format-strings