侧边栏壁纸
  • 累计撰写 134 篇文章
  • 累计创建 62 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

C#中string.Format方法格式化字符串、数值、日期详解

码峰
2022-12-08 / 0 评论 / 0 点赞 / 509 阅读 / 2,441 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-12-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

string.Format()功能

C#中 string.Format()方法的主要功能是把一些对象(Object)的值转化为字符串,并按照format里指定的格式组成另外一个字符串,对于一些数字,货币,十进制,十六进制,日期,百分比等数值格式化,string.Format方法非常有用。
有兴趣的同学可以去看官方文档 String.Format Method (System) | Microsoft Docs:https://docs.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0
本文仅对官方文档中的内容进行提炼和总结。

string.Format()的重载方法

string.Format()的重载方法如下:

public static string Format(IFormatProvider provider, string format, object arg0)
 
public static string Format(IFormatProvider provider, string format, object arg0, object arg1)
 
public static string Format(IFormatProvider provider, string format, object arg0, object arg1, object arg2)
 
public static string Format(IFormatProvider provider, string format, params object[] args)
 
public static string Format(string format, object arg0)
 
public static string Format(string format, object arg0, object arg1)
 
public static string Format(string format, object arg0, object arg1, object arg2)
 
public static string Format(string format, params object[] args)

因为Format方法接收的参数是Object类型,所以对于值类型会涉及到装箱的操作
下面通过一些例子来详细介绍string.Format的用法。
如果你想要往另外一个字符串中插入某个object、variable、或者expression的值,那么就可以尝试使用String.Format,例如下面的例子:

Decimal pricePerOunce = 17.36m
String s = String.Format("The current price is {0} per ounce", pricePerOunce);
Console.WriteLine(s);
// Result: The current price is 17.36 per ounce.

你也可以去控制 大括号里的值 的 格式:

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0:C2} per ounce.", pricePerOunce);
Console.WriteLine(s);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.

除了控制格式之外,你还可以控制 对齐(alignment) 和 间隔 (spacing)
String.Format的参数列表中,先是一个格式化的字符串,后面跟要往该字符串指定位置(即 { } 的位置)中插入的对象或者表达式(数量可以是任意多个,虽然String.Format提供了好几种重载方式,其实你并不用去关心究竟在用哪一个)。

大括号里可以写数字,对应了这些待插入项的序号(即第几个),例如:

string s = String.Format("At {0}, the temperature is {1}°C.", DateTime.Now, 20.4);
Console.WriteLine(s);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'

控制格式(Control Formating)

如上文所说,我们可以在大括号 { } 里通过添加数字来指定插入参数列表中的第几个数(例如 {0} ,表示格式化字符串后面的第一个参数),同时我们也可以在数字后面使用冒号‘:’再后缀一些符号来控制更具体一些的格式。
例如::d 提取了时间里的年月日 :t 提取了小时和分钟

string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
Console.WriteLine(s);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'

这里读者可能会疑问:我咋知道有哪些字符串格式呢?确实这些格式化的种类还是比较多的,光靠记忆肯定是不行的,这里给出官方链接,按需要去查即可:
Standard numeric format strings:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
Standard date and time format strings | Microsoft Docs:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings
Standard TimeSpan format strings | Microsoft Docs:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings
Enumeration format strings | Microsoft Docs:https://docs.microsoft.com/en-us/dotnet/standard/base-types/enumeration-format-strings
你也可以使用一些格式的标识符(Format Specifier)来定制自己需要的格式类型

控制间距(Control Spacing)

你可以定义插入到目标字符串的字符串片段的宽度,例如,可以使用 {0,12} 表示插入的字符串的宽度为12
可以用于文本对齐,例如:

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
var sb = new System.Text.StringBuilder();
sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population"));
for (int index = 0; index < years.Length; index++)
    sb.Append(String.Format("{0,6} {1,15:N0}\n", years[index], population[index]));
 
Console.WriteLine(sb);
 
// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203

控制左右对齐 (Control Alignment)

默认是右对齐,可以使用 如 {0, -12} 来设置为左对齐:

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
Console.WriteLine($"\n{s}");
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203

string.Format 方法的几种定义

String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项。
常用的格式化数值结果表

字符 说明 示例 输出
C 货币 string.Format(“{0:C3}”, 2) $2.000
D 十进制 string.Format(“{0:D3}”, 2) 002
E 科学计数法 string.Format(“{0:E3}”, 12) 1.20E+001
F 小数点后的位数固定 string.Format(“{0:F2}”, 4384.5) 4384.50
G 常规 string.Format(“{0:G}”, 2) 2
N 用逗号隔开的数字 string.Format(“{0:N}”, 250000) 250,000.00
X 十六进制 string.Format(“{0:X000}”, 12) C
P 百分比计数法 432,000.00%
自定义 string.Format(“{0:000.000}”, 12.2) 012.200

常用的几种实例

字符串的数字格式

string str1 =string.Format("{0:N1}",56789);        //result: 56,789.0
string str2 =string.Format("{0:N2}",56789);        //result: 56,789.00
string str3 =string.Format("{0:N3}",56789);        //result: 56,789.000
string str8 =string.Format("{0:F1}",56789);        //result: 56789.0
string str9 =string.Format("{0:F2}",56789);        //result: 56789.00
string str11 =(56789 / 100.0).ToString("#.##");      //result: 567.89
string str12 =(56789 / 100).ToString("#.##");       //result: 567

格式化货币

格式化货币,跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元

string.Format("{0:C}",0.2)

结果为:¥0.20 (英文操作系统结果:$0.20)
默认格式化小数点后面保留两位小数,如果需要保留一位或者更多,可以指定位数

string.Format("{0:C1}",23.15)

结果为:¥23.2 (截取会自动四舍五入)

格式化多个Object实例

string.Format("市场价:{0:C},优惠价{1:C}",23.15,19.82)

格式化十进制的数字

格式化成固定的位数,位数不能少于未格式化前,只支持整形

string.Format("{0:D3}",23) //结果为:023
string.Format("{0:D2}",1223) //结果为:1223,(精度说明符指示结果字符串中所需的最少数字个数。)

用分号隔开的数字,并指定小数点后的位数

string.Format("{0:N}", 14200) //结果为:14,200.00 (默认为小数点后面两位)
string.Format("{0:N3}", 14200.2458) //结果为:14,200.246 (自动四舍五入)

格式化百分比

string.Format("{0:P}", 0.24583) //结果为:24.58% (默认保留百分的两位小数)
string.Format("{0:P1}", 0.24583) //结果为:24.6% (自动四舍五入)

零占位符和数字占位符

string.Format("{0:0000.00}", 12394.039) //结果为:12394.04
string.Format("{0:0000.00}", 194.039) //结果为:0194.04
string.Format("{0:###.##}", 12394.039) //结果为:12394.04
string.Format("{0:####.#}", 194.039) //结果为:194

下面的这段说明比较难理解,多测试一下实际的应用就可以明白了。
零占位符: 如果格式化的值在格式字符串中出现“0”的位置有一个数字,则此数字被复制到结果字符串中。小数点前最左边的“0”的位置和小数点后最右边的“0”的位置确定总在结果字符串中出现的数字范围。 “00”说明符使得值被舍入到小数点前最近的数字,其中零位总被舍去。
数字占位符: 如果格式化的值在格式字符串中出现“#”的位置有一个数字,则此数字被复制到结果字符串中。否则,结果字符串中的此位置不存储任何值。
请注意,如果“0”不是有效数字,此说明符永不显示“0”字符,即使“0”是字符串中唯一的数字。如果“0”是所显示的数字中的有效数字,则显示“0”字符。 “##”格式字符串使得值被舍入到小数点前最近的数字,其中零总被舍去。

日期格式化

string.Format("{0:d}",System.DateTime.Now) //结果为:2009-3-20 (月份位置不是03)
string.Format("{0:D}",System.DateTime.Now) //结果为:2009年3月20日
string.Format("{0:f}",System.DateTime.Now) //结果为:2009年3月20日 15:37
 string.Format("{0:F}",System.DateTime.Now) //结果为:2009年3月20日 15:37:52
 string.Format("{0:g}",System.DateTime.Now) //结果为:2009-3-20 15:38
 string.Format("{0:G}",System.DateTime.Now) //结果为:2009-3-20 15:39:27
 string.Format("{0:m}",System.DateTime.Now) //结果为:3月20日
string.Format("{0:t}",System.DateTime.Now) //结果为:15:41
 string.Format("{0:T}",System.DateTime.Now) //结果为:15:41:50
0

评论区