String.Format()方法

本文介绍如何使用C#中的String.Format方法来格式化字符串和日期,包括预定义和自定义格式选项,并提供文化相关格式设置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zeichenketten und Datumswerte formatieren

Oft kommt es vor, dass man Zeichenketten und Datumswerte in einem bestimmten Format ausgeben muss. Das Microsoft Framework stellt eine mächte Methode zur Verfügung mit der man einfach und schnell Formatvorlagen auf Zeichenketten oder Datumswerte anwenden kann: String.Format().

Im folgenden findet man die wichtigtens Formate:

FormatAufrufErgebnis
Zahlen mit vordefiniertem Format formatieren (zahl = 1000000)
cString.Format("{0:c}", zahl)1.000.000.00 ?
dString.Format("{0:d}", zahl)1000000
eString.Format("{0:e}", zahl)1000000e+006
fString.Format("{0:f}", zahl)1000000,00
gString.Format("{0:g}", zahl)1000000
nString.Format("{0:n}", zahl)1.000.000.00
xString.Format("{0:x}", zahl)f4240
Zahlen mit eigenem Format formatieren (zahl = 1000000)
0String.Format("{0:00.0000}", zahl)1000000,0000
#String.Format("{0:(#).##}", zahl)(1000000)
.String.Format("{0:0.0}", zahl)1000000,0
,String.Format("{0:0,0}", zahl)1.000.000
,.String.Format("{0:0,.}", zahl)1000
%String.Format("{0:0%}", zahl)100000000%
eString.Format("{0:00e+0}", zahl)10e+5
 
Datum mit vordefiniertem Format formatieren
uString.Format("{0:u}", DateTime.Now)2003-12-03 14:43:36Z
UString.Format("{0:U}", DateTime.Now)Mittwoch, 3. Dezember 2003 13:43:36
rString.Format("{0:r}", DateTime.Now)Wed, 03 Dec 2003 14:43:36 GMT
sString.Format("{0:s}", DateTime.Now)2003-12-03T14:43:36
YString.Format("{0:Y}", DateTime.Now)Dezember 2003
gString.Format("{0:g}", DateTime.Now)03.12.2003 14:43
GString.Format("{0:G}", DateTime.Now)03.12.2003 14:43:36
MString.Format("{0:M}", DateTime.Now)03 Dezember
dString.Format("{0:d}", DateTime.Now)03.12.2003
DString.Format("{0:D}", DateTime.Now)Mittwoch, 3. Dezember 2003
tString.Format("{0:t}", DateTime.Now)14:43
TString.Format("{0:T}", DateTime.Now)14:43:36
fString.Format("{0:f}", DateTime.Now)Mittwoch, 3. Dezember 2003 14:43
FString.Format("{0:F}", DateTime.Now)Mittwoch, 3. Dezember 2003 14:43:36
Datum mit eigenem Format formatieren
ddString.Format("{0:F}", DateTime.Now)03
dddString.Format("{0:F}", DateTime.Now)Mi
ddddString.Format("{0:F}", DateTime.Now)Mittwoch
MMString.Format("{0:F}", DateTime.Now)12
MMMString.Format("{0:F}", DateTime.Now)Dez
MMMMString.Format("{0:F}", DateTime.Now)Dezember
yyString.Format("{0:F}", DateTime.Now)03
yyyyString.Format("{0:F}", DateTime.Now)2003
ssString.Format("{0:F}", DateTime.Now)36
mmString.Format("{0:F}", DateTime.Now)43
hhString.Format("{0:F}", DateTime.Now)02
HHString.Format("{0:F}", DateTime.Now)14
ggString.Format("{0:F}", DateTime.Now)n. Chr.
ttString.Format("{0:F}", DateTime.Now)
zzString.Format("{0:F}", DateTime.Now)+01
zzzString.Format("{0:F}", DateTime.Now)+01:00

第二部分:

String.Format("{0}", "formatting string"};
Tue, 14 Jul 2004 19:30:00 GMT
One of the painful things about good old ASP was string formatting, VBScript simply didn't have anything useful. C# (and VB.Net) do, but MSDN doesn't provide a quick reference to the formatting options. So here's a quick reference.

To compare string formatting in C# to those in C lets have an example,

char szOutput[256];
sprintf(szOutput, "At loop position %d./n", i);


sprintf takes an output buffer, a format string and any number of arguments to substitute into the format string.

The C# equivalent for sprintf is String.Format, which takes a format string and the arguments. It returns a string, and because you're not passing in a buffer there's no chance of a buffer overflow.

string outputString = String.Format("At loop position {0}./n", i);


So why doesn't have the format argument have parameters specifying what data type you're formatting? The CLR objects have metadata which informs the CLR what the objects are, and each object has a standard ToString() method which returns a string representation of that object. Much nicer than C where if you passed the wrong type of variable into sprintf everything could come crashing down.

The ToString method can accept a string parameter which tells the object how to format itself. In the call to String.Format , the formatting string is passed after the position, for example, "{0:##}". The text inside the curly braces is {argumentIndex[,alignment][:formatString]}. If alignment is positive, the text is right-padding to fill the specified field length, if it's negative, it's left-padded.

formatting strings
There's not much formatting that can be applied to a string. Only the padding / alignment formatting options can be applied. These options are also available to every argument, regardless of type.

example output
String.Format("--{1,10}--", "test"); --      test--
String.Format("--{1,-10}--", "test"); --test      --


formatting numbers
Number formatting is culture dependant. For example, formatting a currency string on my laptop will return a result like £9.99, formatting a currency on a machine set for the US region would return $9.99.

specifier type format output
(double 1.2345) output
(int -12345)
c currency {0:c} £1.23 -£12,345.00
d decimal
(whole number) {0:d} System.FormatException -12345
e exponent / scientific {0:e} 1.234500e+000 -1.234500e+004
f fixed point {0:f} 1.23 -12345.00
g general {0:g} 1.2345 -12345
n number {0:n} 1.23 -12,345.00
r round trippable {0:r} 1.23 System.FormatException
x hexadecimal {0:x4} System.FormatException ffffcfc7


custom number formatting
specifier type format output
(double 1234.56)
0 zero placeholder {0:00.000} 1234.560
# digit placeholder {0:#.##} 1234.56
. decimal point placeholder {0:0.0} 1234.6
, thousand separator {0:0,0} 1,235
% percentage {0:0%} 123456%


In addition there is the group separator; this is useful for varying the format, depending on the value of the parameter passed. For example

String.Format("{0:£#,##0.00;(£#,##0.00);Nothing}", value);


This will output "£1,240.00" if passed 1243.56.  It will output the same format bracketed if the value is negative "(£1,240.00)", and will output the string "Nothing" if the number is zero.

date formatting
Date formats are very dependant on the culture information passed. The examples below are shown using the UK culture.

specifier type output
(June 8, 1970 12:30:59)
d Short Date 08/06/1970
D Long Date 08 June 1970
t Short Time 12:30
T Long Time 12:30:59
f Full date and time 08 June 1970 12:30
F Full date and time (long) 08 June 1970 12:30:59
g Default date and time 08/06/1970 12:30
G Default date and time (long) 08/06/1970 12:30:59
M Day / Month 8 June
r RFC1123 date string Mon, 08 Jun 1970 12:30:59 GMT
s Sortable date/time 1970-06-08T12:30:59
u Universal time, local timezone 1970-06-08 12:30:59Z
Y Month / Year June 1970


custom date formatting
specifier type output
(June 8, 1970 12:30:59)
dd Day 08
ddd Short Day Name Mon
dddd Full Day Name Monday
hh 2 digit hour 12
HH 2 digit hour (24 hour) 12
mm 2 digit minute 30
MM Month 06
MMM Short Month name Jun
MMMM Month name June
ss seconds 59
tt AM/PM PM
yy 2 digit year 70
yyyy 4 digit year 1970
: seperator, e.g. {0:hh:mm:ss} 12:30:59
/ seperator, e.g. {0:dd/mm/yyyy} 08/06/1970


There are others, including time zone formatting and so on, but the ones above are the most commonly used.

culture information
string.format also provides a method which accepts a CultureInfo argument, as an IFormatProvider. This is important when trying to write portable and localisable code, as, for example, month names will change according to the local culture of the machine you are running on. Rather than simply call the standard String.Format you should consider always calling the overloaded culture method. If you don't need to specify a culture you can use the System.Globalization.CultureInfo.InvariantCulture. This will then default your formatting to English, as opposed to the culture of the current thread.

 
<think>好的,用户问的是String.format方法的作用。我需要先解释清楚这个方法的基本功能,然后给出使用示例,这样用户能更好地理解。 首先,String.format用于格式化字符串,替换占位符。需要说明常见的占位符,比如%s、%d、%f等,以及它们的使用方式。可能用户是刚开始学Java,所以例子要简单明了。然后,用户可能想知道为什么用这个方法而不是字符串拼接。这时候需要对比两者的优缺点,比如可读性和性能上的优势。特别是处理多个变量时,格式化更清晰。 还要考虑国际化的问题,不同地区的数字和货币格式可能不同。可以提到使用Locale参数的方法,这样用户知道如何处理多语言环境。 接下来,用户可能遇到的问题包括格式错误,比如参数类型不匹配导致的异常。需要提醒注意事项,比如参数数量和类型要匹配,避免运行时错误。 最后,用户可能想知道实际应用场景,比如日志记录、用户界面显示等。举几个实际的例子,帮助他们理解何时使用这个方法。 相关问题方面,应该涵盖占位符列表、与拼接的区别、本地化处理、性能比较以及常见错误。这样用户可以进一步深入学习或解决相关问题。</think>`String.format` 是 Java 中用于格式化字符串的方法,其核心作用是 **将占位符替换为指定参数**,生成格式统一、可读性高的字符串。类似于 C 语言的 `printf`,但返回值为 `String`。 --- ### 基本语法 ```java String formattedString = String.format("格式模板", 参数1, 参数2, ...); ``` --- ### 常见占位符示例 | 占位符 | 作用 | 示例 | |--------|-----------------------|---------------------| | `%s` | 字符串 | `String.format("%s年%d月", 2024, 3)` → `"2024年3月"` | | `%d` | 整数(十进制) | `String.format("第%d名", 1)` → `"第1名"` | | `%f` | 浮点数 | `String.format("价格%.2f元", 9.99)` → `"价格9.99元"` | | `%c` | 字符 | `String.format("性别:%c", '男')` → `"性别:男"` | | `%b` | 布尔值 | `String.format("是否通过:%b", true)` → `"是否通过:true"` | | `%%` | 百分号(转义) | `String.format("折扣:%d%%", 85)` → `"折扣:85%"` | --- ### 核心优势 1. **可读性**:避免字符串拼接的冗余代码 ```java // 拼接写法 String s = "用户:" + name + ",年龄:" + age + ",余额:" + money + "元"; // 格式化写法 String s = String.format("用户:%s,年龄:%d,余额:%.2f元", name, age, money); ``` 2. **国际化支持**:自动适配本地化格式(如货币、千分位) ```java // 按美国格式输出:$1,234.57 String s = String.format(Locale.US, "金额:%,.2f", 1234.567); ``` 3. **格式控制**:对齐、补零、精度限制等高级操作 ```java // 右对齐并保留2位小数,宽度10: 3.14 String s = String.format("%10.2f", 3.1415); // 补零:007 String s = String.format("%03d", 7); ``` --- ### 注意事项 - **参数类型需匹配占位符**:若类型不匹配会抛出 `IllegalFormatConversionException`。 - **参数数量需匹配占位符数量**:缺少参数会抛出 `MissingFormatArgumentException`。 - **性能权衡**:频繁调用可能比 `StringBuilder` 略慢,但可读性优先。 --- ### 实际应用场景 1. **日志记录**:格式化输出时间、线程名、日志等级等。 2. **用户界面**:动态生成带变量的提示语(如 `"剩余%d秒"`)。 3. **数据导出**:按固定格式生成 CSV、JSON 字符串。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值