首页 程序笔记 C#中string.Format方法格式化字符串、数值、日期详解

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

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
1

站心网

string.Format()功能 C#中 string.Format()方法的主要功能是把一些对象(Object)的值转化为字符串,并按照..

为您推荐

软件产品开发中常见的10个问题及处理方法

常见的10个问题#产品开发中常见的10个问题思维导图需求相关#1. 需求不明确#在日常工作中,需求来源于用户、老板、客户、竞品分析、业务部门、产品经理等,这些人或部门会提出需求,因为他们不是产品经理,提出的需求..

ThinkPHP5.0如何全局替换前端某个字符串

在 Nginx 配置文件中添加以下内容:sub_filter'旧字符串''新字符串';sub_filter_onceoff;在.htaccess文件中添加以下内容:<IfModulemod_substitute.c>AddOutputFilterByTypeSUBSTITUTEtext/htmlSubs..

交易系统:退款单模型设计详解

大家好,我是汤师爷~和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。售后域核心概念模型1、退款单退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织退款单ID..

js 截取字符串

本文为大家介绍三种 js 截取字符串的方法:substring() 方法;substr() 方法;slice() 方法;方法1:substring() 方法string.substring(from, to)方法从 from 位置截取到 to 位置,to 可选,没有设置时默认到末尾。..

一个提升运营/营销转化率的万能方法!

之前,笔者有分享过说我最喜欢的增长是可复制可持续的增长,它一般都会有三个关键过程:首先是小范围测试,低成本试错,也就是最小可行性验证,让ROI最大化。然后是把测试的最优结果整理为可执行的标准化化流程。前..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

学习最重要是方法,管理最重要是高度

技术学习要兼顾深度和广度夯实技术基础这么多年来,我面试了很多人。我越发感到「技术基础」非常重要。很多技术的本质是一样的。技术基础足够好的话,学东西可以非常快。往下到操作系统层面,甚至计算机硬件层面,你..

详解:订单履约系统规划

大家好,我是汤师爷~什么是订单履约系统?订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。..

Redis 数据结构详解

Redis 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。Redis 这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。原子操作:最小的操作单位,不能继续拆分..

Java中String类常见的方法

以下介绍字符串常见的几个方法。介绍String类在 Java 中,String类是一个代表字符串的类,具有以下特性:不可变性:String对象一旦被创建就是不可变的,即它们的值在创建后不能被更改。任何对String对象的修改操作实..

.net 通过 HttpClient 下载文件同时报告进度的方法

通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度看起来很简单,于是直接给代码private static async Task ..

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

javascript 6种连接数组的方法和对比

在 JavaScript 中,有多种方法可以用来连接数组,以下是常见的几种:1. concat() 方法用于连接两个或多个数组,返回一个新的数组,不修改原数组。const arr1 = [1, 2, 3];const arr2 = [4, 5, 6];const result = arr..

.NET开源ORM FreeSql常见问题和解决方法

FreeSql 是一个功能强大的 .NET 开源 ORM(对象关系映射)工具,支持多种数据库类型并提供丰富的功能特性。以下是使用 FreeSql 过程中常见的问题及其解决方法:1. 数据库连接问题问题描述:无法连接数据库,报错提示..

js 数组方法 - 修改篇

js数组方法可分为三类:修改、访问、迭代。修改:改变原有数组访问:不改变原有数组,从原有数组中获取数据迭代:对数组的每一项进行处理,返回数据本文主要介绍数组的修改篇一、增加1、push()含义:在数组末尾添加..

.Net Core中Dapper的使用详解

1.安装Dapper这里直接使用Nuget安装。安装版本是1.50.5安装完成之后,发现Nuget下已经有了Dapper。2.创建DapperHelper接下来创建一个DapperHelper帮助类,来进行读取数据库连接字符串,打开数据库等操作。public cla..

sourcetree安装跳过注册方法

SourceTree下载提取码: ni9m 需翻墙或者破解注册当前只有Win的版本,Mac自行百度很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作。然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者..

.NET开发中常见的异常报错原因和解决方法?

在 .NET 开发中,常见的报错通常涉及代码编写、配置和运行时环境。以下是一些常见的报错类型及其解决建议:1. NullReferenceException原因:尝试访问空对象的成员。解决:在访问对象之前检查是否为 null,可以使用 C..

发表回复

返回顶部