Console.WriteLine()函数的格式一直没怎么注意。今天同事问起Console.WriteLine({0:D3},a)的意义,突然发现不知道D表明什么意义。之前觉得{0,4}是指第一个变量输出时占8位,今天查了一下,发现也并不彻底正确。html
其中格式项都采用以下形式:git
{index[,alignment][:formatString]} 数组
其中"index"指索引占位符,这个确定都知道;ide
",alignment"按字面意思显然是对齐方式,以","为标记;函数
":formatString"就是对输出格式的限定,以":"为标记。post
alignment:可选,是一个带符号的整数,指示首选的格式化字段宽度。若是“对齐”值小于格式化字符串的长度,“对齐”会被忽略,而且使用格式化字符串的长度做为字段宽度。若是“对齐”为正数,字段的格式化数据为右对齐;若是“对齐”为负数,字段的格式化数据为左对齐。若是须要填充,则使用空白。若是指定“对齐”,就须要使用逗号。测试
formatString:由标准或自定义格式说明符组成.spa
下表是从网上得来:操作系统
字符.net |
说明 |
示例 |
输出 |
C |
货币 |
string.Format("{0:C3}", 2) |
$2.000 |
D |
十进制 |
string.Format("{0:D3}", 2) |
002 |
E |
科学计数法 |
1.20E+001 |
1.20E+001 |
G |
常规 |
string.Format("{0:G}", 2) |
2 |
N |
用分号隔开的数字 |
string.Format("{0:N}", 250000) |
250,000.00 |
X |
十六进制 |
string.Format("{0:X000}", 12) |
C |
|
|
string.Format("{0:000.000}", 12.2) |
012.200 |
Specifier |
Type |
Format |
Output (Passed Double 1.42) |
Output (Passed Int -12400) |
c |
Currency |
{0:c} |
$1.42 |
-$12,400 |
d |
Decimal (Whole number) |
{0:d} |
System. FormatException |
-12400 |
e |
Scientific |
{0:e} |
1.420000e+000 |
-1.240000e+004 |
f |
Fixed point |
{0:f} |
1.42 |
-12400.00 |
g |
General |
{0:g} |
1.42 |
-12400 |
n |
Number with commas for thousands |
{0:n} |
1.42 |
-12,400 |
r |
Round trippable |
{0:r} |
1.42 |
System. FormatException |
x |
Hexadecimal |
{0:x4} |
System. FormatException |
cf90 |
Specifier |
Type |
Example (Passed System.DateTime.Now) |
d |
Short date |
10/12/2002 |
D |
Long date |
December 10, 2002 |
t |
Short time |
10:11 PM |
T |
Long time |
10:11:29 PM |
f |
Full date & time |
December 10, 2002 10:11 PM |
F |
Full date & time (long) |
December 10, 2002 10:11:29 PM |
g |
Default date & time |
10/12/2002 10:11 PM |
G |
Default date & time (long) |
10/12/2002 10:11:29 PM |
M |
Month day pattern |
December 10 |
r |
RFC1123 date string |
Tue, 10 Dec 2002 22:11:29 GMT |
s |
Sortable date string |
2002-12-10T22:11:29 |
u |
Universal sortable, local time |
2002-12-10 22:13:50Z |
U |
Universal sortable, GMT |
December 11, 2002 3:13:50 AM |
Y |
Year month pattern |
December, 2002 |
Specifier |
Type |
Example |
Example Output |
dd |
Day |
{0:dd} |
10 |
ddd |
Day name |
{0:ddd} |
Tue |
dddd |
Full day name |
{0:dddd} |
Tuesday |
f, ff, ... |
Second fractions |
{0:fff} |
932 |
gg, ... |
Era |
{0:gg} |
A.D. |
hh |
2 digit hour |
{0:hh} |
10 |
HH |
2 digit hour, 24hr format |
{0:HH} |
22 |
mm |
Minute 00-59 |
{0:mm} |
38 |
MM |
Month 01-12 |
{0:MM} |
12 |
MMM |
Month abbreviation |
{0:MMM} |
Dec |
MMMM |
Full month name |
{0:MMMM} |
December |
ss |
Seconds 00-59 |
{0:ss} |
46 |
tt |
AM or PM |
{0:tt} |
PM |
yy |
Year, 2 digits |
{0:yy} |
02 |
yyyy |
Year |
{0:yyyy} |
2002 |
zz |
Timezone offset, 2 digits |
{0:zz} |
-05 |
zzz |
Full timezone offset |
{0:zzz} |
-05:00 |
: |
Separator |
{0:hh:mm:ss} |
10:43:20 |
/ |
Separator |
{0:dd/MM/yyyy} |
10/12/2002 |
CSDN中例子:
- string myFName = "Fred";
- string myLName = "Opals";
- int myInt = 100;
- string FormatFName = String.Format("First Name = |{0,10}|", myFName);
- string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
- string FormatPrice = String.Format("Price = |{0,10:C}|", myInt);
- Console.WriteLine(FormatFName);
- Console.WriteLine(FormatLName);
- Console.WriteLine(FormatPrice);
-
- FormatFName = String.Format("First Name = |{0,-10}|", myFName);
- FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
- FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
- Console.WriteLine(FormatFName);
- Console.WriteLine(FormatLName);
- Console.WriteLine(FormatPrice);
-
-
String 用法::
这种写法用过没:string.Format("{0,-10}", 8)
www.cnblogs.com 2011-08-03 18:46
作 .net 开发也若干年了,如此写法(下面代码中黄色高亮部分)确是我第一次见(更别提用了):
1 2 3 4 |
var s1 = string.Format("{0,-10}", 8); var s2 = string.Format("{0,10}", 8); var s3 = string.Format("{0,20:yyyy-MM-dd}", DateTime.Today); var s4 = string.Format("4G 内存便宜了{0,12:C2},我打算买{1,4}条", 145, 2) |
大括号中,索引后 分号前,有一个逗号和一个整数(减号表示负数)。
会格式化成为何样子呢?看下调试截图吧:
从上图中能大体看出此端倪,没错:
tring.Format("{0,-10}", 8) 等同于 string.Format("{0}", 8).PadRight(10);
tring.Format("{0,10}", 8) 等同于 string.Format("{0}", 8).PadLeft(10)。
String.Format 方法 format 参数由零或多个文本序列与零或多个索引占位符混合组成,其中索引占位符称为格式项,对应于与此方法的参数列表中的对象。 格式设置过程将每一个格式项替换为相应对象值的字符串表示形式。
格式项的语法以下:
{index[,length][:formatString]}
方括号中的元素是可选的。 下表描述每一个元素。 有关复合格式设置功能(包括格式项的语法)的更多信息,请参见复合格式。
元素 |
说明 |
索引 |
要设置格式的对象的参数列表中的位置(从零开始)。 若是由 index 指定的对象为 null,则格式项将被 String.Empty 替换。 因为该重载在其参数列表中只有单个对象,index 的值必须始终为 0。 若是 index 位置没有参数,将引起 FormatException。 |
,length |
参数的字符串表示形式中包含的最小字符数。 若是该值是正的,则参数右对齐;若是该值是负的,则参数左对齐。 |
:formatString |
要设置格式的对象支持的标准或自定义格式字符串。 formatString 的可能值与该对象的 ToString(format) 方法支持的值相同。 若是没有指定 formatString,而且要设置格式的对象实现了 IFormattable 接口,则将传递 null 做为用做 IFormattable.ToString 格式字符串的 format 参数的值。 |
元素
说明
索引
,length
参数的字符串表示形式中包含的最小字符数。 若是该值是正的,则参数右对齐;若是该值是负的,则参数左对齐。
:formatString
MSDN 原文连接:Format 方法 (String, Object)
,length 其实把 String.PadLeft 和 String.PadRight 的功能融合在的 String.Format 方法中,简化了代码的编写。
若是没有这种格式,代码写起来麻烦多了:
1 2 3 |
var s5 = string.Format("4G 内存便宜了{0},我打算买{1}条", 145.ToString("C2").PadLeft(12), 2.ToString().PadLeft(4)) |
看起来不直观,复杂,如文首代码中的 “我打算买{1,4}条”。
实际使用少,没用过的看了很纳闷。
前言
若是你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串类,那么你对String.Format方法确定很熟悉。在C#中也常用这个方法来格式化字符串,好比下面这样:
int x = 16; decimal y = 3.57m; string h = String.Format( "item {0} sells at {1:C}", x, y ); Console.WriteLine(h)
在个人机器上,能够获得下面的输出:
item 16 sells at ¥3.57
也许你的机器上的输出和这个不太同样。这是正常的,本文稍后就会解释这个问题。
在咱们平常使用中,更多的是使用Console.WriteLine方法来输出一个字符串。其实String.Format和Console.WriteLine有不少共同点。两个方法都有不少重载的格式而且采用无固定参数的对象数组做为最后一个参数。下面的两个语句会产生一样的输出。
Console.WriteLine( "Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8'); string u = String.Format("Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8'); Console.WriteLine(u)
输出以下:
Hello 123 45.67 True Q 4 5 6 7 8 Hello 123 45.67 True Q 4 5 6 7 8
2 字符串格式
String.Format和WriteLine都遵照一样的格式化规则。格式化的格式以下:"{ N [, M ][: formatString ]}", arg1, ... argN,在这个格式中:
1) N是从0开始的整数,表示要格式化的参数的个数
2) M是一个可选的整数,表示格式化后的参数所占的宽度,若是M是负数,那么格式化后的值就是左对齐的,若是M是正数,那么格式化后的值是右对齐的
3) formatString是另一个可选的参数,表示格式代码
argN表示要格式化的表达式,和N是对应的。
若是argN是空值,那么就用一个空字符串来代替。若是没有formatString,那么就用参数N对应的ToString方法来格式化。下面的语句会产生一样的输出:
ublic class TestConsoleApp { public static void Main(string[] args) { Console.WriteLine(123); Console.WriteLine("{0}", 123); Console.WriteLine("{0:D3}", 123); } }
输出是:
123 123 123
也能够经过String.Format获得一样的输出。
tring s = string.Format("123"); string t = string.Format("{0}", 123); string u = string.Format("{0:D3}", 123); Console.WriteLine(s); Console.WriteLine(t); Console.WriteLine(u)
所以有以下结论:
(,M)决定了格式化字符串的宽度和对齐方向
(:formatString)决定了如何格式化数据,好比用货币符号,科学计数法或者16进制。就像下面这样:
Console.WriteLine("{0,5} {1,5}", 123, 456); // 右对齐 Console.WriteLine("{0,-5} {1,-5}", 123, 456); // 左对齐
输出是
123 456 123 456
也能够合并这些表达式,先放一个逗号,再放一个冒号。就像这样:
Console.WriteLine("{0,-10:D6} {1,-10:D6}", 123, 456)
输出是:
000123
000456
咱们能够用这种格式化特性来对齐咱们的输出。
Console.WriteLine("\n{0,-10}{1,-3}", "Name","Salary"); Console.WriteLine("----------------"); Console.WriteLine("{0,-10}{1,6}", "Bill", 123456); Console.WriteLine("{0,-10}{1,6}", "Polly", 7890)
输出是:
Name Salary ---------------- Bill 123456 Polly 7890
3 格式化标识符
标准的数学格式字符串用于返回一般使用的字符串。它们一般象X0这样的格式。X是格式化标识符,0是精度标识符。格式标识符号共有9种,它们表明了大多数经常使用的数字格式。就像下表所示:
字母 |
含义 |
C或c |
Currency 货币格式 |
D或d |
Decimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了) |
E或e |
Exponent 指数格式 |
F或f |
Fixed point 固定精度格式 |
G或g |
General 经常使用格式 |
N或 |
用逗号分割千位的数字,好比1234将会被变成1,234 |
P或 |
Percentage 百分符号格式 |
R或r |
Round-trip 圆整(只用于浮点数)保证一个数字被转化成字符串之后能够再被转回成一样的数字 |
X或x |
Hex 16进制格式 |
若是咱们使用下面的表达方式,让咱们看看会发生什么
ublic class FormatSpecApp { public static void Main(string[] args) { int i = 123456; Console.WriteLine("{0:C}", i); // ¥123,456.00 Console.WriteLine("{0:D}", i); // 123456 Console.WriteLine("{0:E}", i); // 1.234560E+005 Console.WriteLine("{0:F}", i); // 123456.00 Console.WriteLine("{0:G}", i); // 123456 Console.WriteLine("{0:N}", i); // 123,456.00 Console.WriteLine("{0:P}", i); // 12,345,600.00 % Console.WriteLine("{0:X}", i); // 1E240 } }
精度控制标识控制了有效数字的个数或者十进制数小数的位数。
R(圆整)格式仅仅对浮点数有效。这个值首先会用通用格式来格式化。对于双精度数有15位精度,对于单精度数有7位精度。若是这个值能够被正确地解析回原始的数字,就会用通用格式符来格式化。若是不能解析回去的话,那么就会用17位精度来格式化双精度数,用9位精度来格式化单精度数。尽管咱们能够在圆整标识符后面添加有效数字的位数,可是它会被忽略掉。
double d = 1.2345678901234567890; Console.WriteLine("Floating-Point:\t{0:F16}", d); // 1.2345678901234600 Console.WriteLine("Roundtrip:\t{0:R16}", d); // 1.2345678901234567
若是标准格式化标识符还不能知足你。你可使用图形化格式字符串来建立定制的字符串输出。图形化格式化使用占位符来表示最小位数,
最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示
符号 |
名称 |
含义 |
0 |
0占位符 |
用0填充不足的位数 |
# |
数字占位符 |
用#代替实际的位数 |
. |
十进制小数点 |
|
, |
千位分隔符 |
用逗号进行千位分割,好比把1000分割成1,000 |
% |
百分符号 |
显示一个百分标识 |
E+0 E-0 e+0 e-0 |
指数符号 |
用指数符号格式化输出 |
\ |
专注字符 |
用于传统格式的格式化序列,好比"\n"(新行) |
'ABC' "ABC" |
常量字符串 |
显示单引号或者双引号里面的字符串 |
|
区域分隔符 |
若是数字会被格式化成整数,负数,或者0,用;来进行分隔 |
,. |
缩放符号 |
数字除以1000 |
看下面的例子:
double i = 123456.42; Console.WriteLine(); Console.WriteLine("{0:000000.00}", i); //123456.42 Console.WriteLine("{0:00.00000000e+0}", i); //12.34564200e+4 Console.WriteLine("{0:0,.}", i); //123 Console.WriteLine("{0:#0.000}", i); // 123456.420 Console.WriteLine("{0:#0.000;(#0.000)}", i); // 123456.420 Console.WriteLine("{0:#0.000;(#0.000);<zero>}", i); // 123456.420 Console.WriteLine("{0:#%}", i); // 12345642% i = -123456.42; Console.WriteLine(); Console.WriteLine("{0:000000.00}", i); //-123456.42 Console.WriteLine("{0:00.00000000e+0}", i); //-12.34564200e+4 Console.WriteLine("{0:0,.}", i); //-123 Console.WriteLine("{0:#0.000}", i); // -123456.420 Console.WriteLine("{0:#0.000;(#0.000)}", i); // (123456.420) Console.WriteLine("{0:#0;(#0);<zero>}", i); // (123456) Console.WriteLine("{0:#%}", i); // -12345642% i = 0; Console.WriteLine(); Console.WriteLine("{0:0,.}", i); //0 Console.WriteLine("{0:#0}", i); // 0 Console.WriteLine("{0:#0;(#0)}", i); // 0 Console.WriteLine("{0:#0;(#0);<zero>}", i); // <zero> Console.WriteLine("{0:#%}", i); // %
4 数字字符串的解析
全部的基础类型都有ToString方法,它是从object类型中继承过来的。全部的数值类型都有Parse方法,它用字符串为参数,而且返回相等的数值。好比
ublic class NumParsingApp { public static void Main(string[] args) { int i = int.Parse("12345"); Console.WriteLine("i = {0}", i); int j = Int32.Parse("12345"); Console.WriteLine("j = {0}", j); double d = Double.Parse("1.2345E+6"); Console.WriteLine("d = {0:F}", d); string s = i.ToString(); Console.WriteLine("s = {0}", s); } }
输出以下
i = 12345 j = 12345 d = 1234500.00 s = 12345
在缺省情况下,某些非数字字符是能够存在的。好比开头和结尾的空白。逗号和小数点,加号和减号,所以,下面的Parse语句是同样的
tring t = " -1,234,567.890 "; //double g = double.Parse(t); // 和下面的代码干一样的事情 double g = double.Parse(t, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite); Console.WriteLine("g = {0:F}", g)
输出都是这样
g = -1234567.89
注意到,若是你要使用NumberStyles,就要添加对System.Globalization的引用,而后就可使用不一样NumberStyles的组合或者其中的任意一种。若是你想兼容货币符号,就须要使用重载的Parse方法,它们采用了NumberFormatInfo对象做为一个参数,而后你能够设置NumberFormatInfo的CurrencySymbol属性来调用Parse方法,好比:
上面的代码有以下输出
h = -1234567.89
除了NumberFormatInfo,还可使用CultureInfo类。CultureInfo表明了某种特定的文化,包括文化的名字,书写的方式,日历的格式。对于某种特定文化的操做是很是广泛的状况,好比格式化日期和排序。文化的命名方式听从RFC1766标准,使用<语言代码2>-<国家/地区码2>的方式,其中的<语言代码2>是两个小写的字母,它们来自ISO639-1;<国家/地区码2>是两个大写字母,它们来自ISO3166。好比,美国英语是“en-US"。英国英语是"en-GB"。特立尼达和多巴哥英语是"en-TT"。例如,咱们能够建立一个美国英语的CultureInfo对象而且基于这种文化将数字转换成字符串。
int k = 12345; CultureInfo us = new CultureInfo("en-US"); string v = k.ToString("c", us); Console.WriteLine(v)
输出是:
$12,345.00
要注意到,咱们使用了重载的ToString方法,它把第一个格式化字符串当成第一个参数,将一个CultureInfo对象(执行了IFormatProvider对象)做为第二个参数。这儿有第二个例子,对于丹麦人来讲:
CultureInfo dk = new CultureInfo("da-DK"); string w = k.ToString("c", dk); Console.WriteLine(w)
输出是:
kr 12.345,00
5 字符串和日期
一个日期对象有个叫Ticks的属性。它存储了自从公元1年的1月1号上午12点开始的,以100纳秒为间隔的时间。好比,Ticks值等于31241376000000000L表示公元100年,星期五,1月1号,上午12点这一时间。Ticks老是以100纳秒为间隔递增。
DateTime的值以存储在DateTimeFormatInfo实例里面的标准或者自定义的方式来表示。为了修改一个日期显示的方式,DateTimeFormatInfo实例必需要是可写的,以便咱们写入自定义的格式而且存入属性中
using System.Globalization; public class DatesApp { public static void Main(string[] args) { DateTime dt = DateTime.Now; Console.WriteLine(dt); Console.WriteLine("date = {0}, time = {1}\n", dt.Date, dt.TimeOfDay); } }
代码会产生下面的输出
23/06/2001 17:55:10 date = 23/06/2001 00:00:00, time = 17:55:10.3839296
下表列出了标准的格式字符串以及相关的DateTimeFormatInfo属性
D |
|
|
D |
MM/dd/yyyy |
ShortDatePattern(短日期模式) |
D |
dddd,MMMM dd,yyyy |
LongDatePattern(长日期模式) |
F |
dddd,MMMM dd,yyyy HH:mm |
Full date and time (long date and short time)(全日期和时间模式) |
F |
dddd,MMMM dd,yyyy HH:mm: |
FullDateTimePattern (long date and long time)(长日期和长时间) |
G |
MM/dd/yyyy HH:mm |
General (short date and short time)(通用模式,短日期和短期) |
G |
MM/dd/yyyy HH:mm: |
General (short date and long time)(通用模式,短日期和长时间) |
M,M |
MMMM dd |
MonthDayPattern(月天模式) |
r,R |
ddd,dd MMM yyyy,HH':'mm':'ss 'GMT' |
RFC1123Pattern (RFC1123模式) |
S |
yyyy-MM-dd HH:mm: |
SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地时间的可排序模式) |
T |
HH:mm |
ShortTimePattern (短期模式) |
T |
HH:mm: |
LongTimePattern(长时间模式) |
U |
yyyy-MM-dd HH:mm: |
UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式) |
U |
dddd,MMMM dd,yyyy,HH:mm: |
UniversalSortable-DateTimePattern(通用可排序模式) |
y,Y |
MMMM,yyyy |
YearMonthPattern(年月模式) |
DateTimeFormatInfo.InvariantInfo属性获得了默认的只读的DateTimeFormatInfo实例,它与文化无关。你能够建立自定义的模式。要注意到的是InvariantInfo不必定和本地的格式同样。Invariant等于美国格式。另外,若是你向DateTime.Format方法传递的第二个参数是null,DateTimeFormatInfo将会是默认的CurrentInfo。好比
Console.WriteLine(dt.ToString("d", dtfi)); Console.WriteLine(dt.ToString("d", null)); Console.WriteLine()
输出是
06/23/2001 23/06/2001
对比选择InvariantInfo和CurrentInfo的。
DateTimeFormatInfo dtfi; Console.Write("[I]nvariant or [C]urrent Info?: "); if (Console.Read() == 'I') dtfi = DateTimeFormatInfo.InvariantInfo; else dtfi = DateTimeFormatInfo.CurrentInfo; DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantInfo; Console.WriteLine(dt.ToString("D", dtfi)); Console.WriteLine(dt.ToString("f", dtfi)); Console.WriteLine(dt.ToString("F", dtfi)); Console.WriteLine(dt.ToString("g", dtfi)); Console.WriteLine(dt.ToString("G", dtfi)); Console.WriteLine(dt.ToString("m", dtfi)); Console.WriteLine(dt.ToString("r", dtfi)); Console.WriteLine(dt.ToString("s", dtfi)); Console.WriteLine(dt.ToString("t", dtfi)); Console.WriteLine(dt.ToString("T", dtfi)); Console.WriteLine(dt.ToString("u", dtfi)); Console.WriteLine(dt.ToString("U", dtfi)); Console.WriteLine(dt.ToString("d", dtfi)); Console.WriteLine(dt.ToString("y", dtfi)); Console.WriteLine(dt.ToString("dd-MMM-yy", dtfi))
输出是
[I]nvariant or [C]urrent Info?: I 01/03/2002 03/01/2002 Thursday, 03 January 2002 Thursday, 03 January 2002 12:55 Thursday, 03 January 2002 12:55:03 01/03/2002 12:55 01/03/2002 12:55:03 January 03 Thu, 03 Jan 2002 12:55:03 GMT 2002-01-03T12:55:03 12:55 12:55:03 2002-01-03 12:55:03Z Thursday, 03 January 2002 12:55:03 01/03/2002 2002 January 03-Jan-02 [I]nvariant or [C]urrent Info?: C 03/01/2002 03/01/2002 03 January 2002 03 January 2002 12:55 03 January 2002 12:55:47 03/01/2002 12:55 03/01/2002 12:55:47 03 January Thu, 03 Jan 2002 12:55:47 GMT 2002-01-03T12:55:47 12:55 12:55:47 2002-01-03 12:55:47Z 03 January 2002 12:55:47 03/01/2002 January 2002 03-Jan-02
/******************************************************************************************
*【Author】:flyingbread
*【Date】:2007年1月18日
*【Notice】:
*一、本文为原创技术文章,首发博客园我的站点(
http://flyingbread.cnblogs.com/
变量.ToString()
字符型转换 转为字符串 12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 ¥12,345.00 12345.ToString("e"); //生成 1.234500e+004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16进制) 12345.ToString("p"); //生成 1,234,500.00%
string.Format 格式化时间,货币
一、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美圆)
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
更详细的说明请下面微软对此的说明或者上msdn上查询。
微软MSDN对string.format的方法说明:
名称 说明 String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项。 String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项。 String.Format (IFormatProvider, String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项。指定的参数提供区域性特定的格式设置信息。 String.Format (String, Object, Object) 将指定的 String 中的格式项替换为两个指定的 Object 实例的值的文本等效项。 String.Format (String, Object, Object, Object) 将指定的 String 中的格式项替换为三个指定的 Object 实例的值的文本等效项。
标准数字格式字符串
格式说明符 名称 说明 C 或 c 货币 数字转换为表示货币金额的字符串。转换由当前 NumberFormatInfo 对象的货币格式信息控制。
精度说明符指示所需的小数位数。若是省略精度说明符,则使用当前 NumberFormatInfo 对象给定的默认货币精度。
D 或 d 十进制数 只有整型才支持此格式。数字转换为十进制数字 (0-9) 的字符串,若是数字为负,则前面加负号。
精度说明符指示结果字符串中所需的最少数字个数。若是须要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。
E 或 e 科学记数法(指数) 数字转换为“-d.ddd…E+ddd”或“-d.ddd…e+ddd”形式的字符串,其中每一个“d”表示一个数字 (0-9)。若是该数字为负,则该字符串以减号开头。小数点前总有一个数字。
精度说明符指示小数点后所需的位数。若是省略精度说明符,则使用默认值,即小数点后六位数字。
格式说明符的大小写指示在指数前加前缀“E”仍是“e”。指数老是由正号或负号以及最少三位数字组成。若是须要,用零填充指数以知足最少三位数字的要求。
F 或 f 定点 数字转换为“-ddd.ddd…”形式的字符串,其中每一个“d”表示一个数字 (0-9)。若是该数字为负,则该字符串以减号开头。
精度说明符指示所需的小数位数。若是忽略精度说明符,则使用当前 NumberFormatInfo 对象给定的默认数值精度。
G 或 g 常规 根据数字类型以及是否存在精度说明符,数字会转换为定点或科学记数法的最紧凑形式。若是精度说明符被省略或为零,则数字的类型决定默认精度,以下表所示。
Byte 或 SByte:3
Int16 或 UInt16:5
Int32 或 UInt32:10
Int64 或 UInt64:19
Single:7
Double:15
Decimal:29
若是用科学记数法表示数字时指数大于 -5 并且小于精度说明符,则使用定点表示法;不然使用科学记数法。若是要求有小数点,而且忽略尾部零,则结果包含小数点。若是精度说明符存在,而且结果的有效数字位数超过指定精度,则经过舍入删除多余的尾部数字。
上述规则有一个例外:若是数字是 Decimal 并且省略精度说明符时。在这种状况下总使用定点表示法并保留尾部零。
使用科学记数法时,若是格式说明符是“G”,结果的指数带前缀“E”;若是格式说明符是“g”,结果的指数带前缀“e”。
N 或 n 数字 数字转换为“-d,ddd,ddd.ddd…”形式的字符串,其中“-”表示负数符号(若是须要),“d”表示数字 (0-9),“,”表示数字组之间的千位分隔符,“.”表示小数点符号。实际的负数模式、数字组大小、千位分隔符以及十进制分隔符由当前 NumberFormatInfo 对象指定。
精度说明符指示所需的小数位数。若是忽略精度说明符,则使用当前 NumberFormatInfo 对象给定的默认数值精度。
P 或 p 百分比 数字转换为由 NumberFormatInfo.PercentNegativePattern 或 NumberFormatInfo.PercentPositivePattern 属性定义的、表示百分比的字符串,前者用于数字为负的状况,后者用于数字为正的状况。已转换的数字乘以 100 以表示为百分比。
精度说明符指示所需的小数位数。若是忽略精度说明符,则使用当前 NumberFormatInfo 对象给定的默认数值精度。
R 或 r 往返过程 只有 Single 和 Double 类型支持此格式。往返过程说明符保证转换为字符串的数值再次被分析为相同的数值。使用此说明符格式化数值时,首先使用常规格式对其进行测试:Double 使用 15 位精度,Single 使用 7 位精度。若是此值被成功地分析回相同的数值,则使用常规格式说明符对其进行格式化。可是,若是此值未被成功地分析为相同数值,则它这样格式化:Double 使用 17 位精度,Single 使用 9 位精度。
虽然此处能够存在精度说明符,但它将被忽略。使用此说明符时,往返过程优先于精度。 X 或 x 十六进制数 只有整型才支持此格式。数字转换为十六进制数字的字符串。格式说明符的大小写指示对大于 9 的十六进制数字使用大写字符仍是小写字符。例如,使用“X”产生“ABCDEF”,使用“x”产生“abcdef”。