字符串格式String.Format和WriteLine都遵守同样的格式化规则。格式化的格式如下:"{ N [, M ][: formatString ]}", arg1, ... argN,
在这个格式中:
1) N是从0开始的整数,表示要格式化的参数的个数.
2) M 是一个可选的整数,表示格式化后的参数所占的宽度,如果M 是负数,则左对齐,如果M 是正数,则右侧对齐
3) formatString 是另外一个可选的参数,表示格式代码.
argN 表示要格式化的表达式,和N 是对应的。
如果 argN 是空值,那么就用一个空字符串来代替。
如果没有formatString,那么就用参数N 对应的ToString 方法来格式化。
3 格式化标识符
标准的数学格式字符串用于返回通常使用的字符串。它们通常象X0 这样的格式。X 是格式化标识符,0 是精度标识符。格式标识符号共
有9 种,它们代表了大多数常用的数字格式。就像下表所示:
字母 含义
C 或c Currency 货币格式
D 或d Decimal 十进制格式(十进制整数,不要和.Net 的Decimal 数据类型混淆了)
E 或e Exponent 指数格式
F 或f Fixed point 固定精度格式
G 或g General 常用格式
N 或n 用逗号分割千位的数字,比如1234 将会被变成1,234
P 或p Percentage 百分符号格式
R 或r Round-trip 圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字
X 或x Hex 16 进制格式
如果我们使用下面的表达方式,让我们看看会发生什么
精度控制标识控制了有效数字的个数或者十进制数小数的位数。
int i = 123456;
Console.WriteLine("{0:C}", i); // ¥123,456.00
Console.WriteLine("{0:C5}", 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);
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);
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);
Console.WriteLine("{0:#%}", i); // %
4 数字字符串的解析
所有的基础类型都有 ToString 方法,它是从object 类型中继承过来的。所有的数值类型都有Parse 方法,它用字符串为参数,并且返
回相等的数值。比如
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
在缺省状况下,某些非数字字符是可以存在的
string 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 的引用
string u = "¥-1,234,567.890 ";
NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencySymbol = "¥";
double h = Double.Parse(u, NumberStyles.Any, ni);
Console.WriteLine("h = {0:F}", h);
上面的代码有如下输出
h = -1234567.89
除了 NumberFormatInfo,还可以使用CultureInfo 类。
CultureInfo 代表了某种特定的文化,包括文化的名字,书写的方式,日历的
格式。对于某种特定文化的操作是非常普遍的情况,比如格式化日期和排序。
int k = 12345;
CultureInfo us = new CultureInfo("en-US");
string v = k.ToString("c", us);
Console.WriteLine(v);
输出是:
$12,345.00
5 字符串和日期
下表列出了标准的格式字符串以及相关的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:ss FullDateTimePattern (long date and long time)(长日期和长时间)
G MM/dd/yyyy HH:mm General (short date and short time)(通用模式,短日期和短时间)
G MM/dd/yyyy HH:mm:ss 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:ss
SortableDateTimePattern (conforms to ISO 8601) using local time(使用本
地时间的可排序模式)
T HH:mm ShortTimePattern (短时间模式)
T HH:mm:ss LongTimePattern(长时间模式)
U yyyy-MM-dd HH:mm:ss UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal
time(通用可排序模式)
U dddd,MMMM
dd,yyyy,HH:mm:ss UniversalSortable-DateTimePattern(通用可排序模式)
y,Y MMMM,yyyy YearMonthPattern(年月模式)
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"); // => 2016-05-09 13:09:55:2350
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff"); // => 2016/05/09 13:09:55:2350
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff dddd"); // => 2016/05/09 13:09:55:2350 星期一