C#格式化字符串

數值型格式化結果表(格式化字符串)

字符html

說明git

示例數組

輸出ide

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

Strings

There really isn't any formatting within a strong, beyond it's alignment. Alignment works for any argument being printed in a String.Format call. post

 

 

Sample Generates
String.Format("->{1,10}<-", "Hello"); -> Hello<-
String.Format("->{1,-10}<-", "Hello"); ->Hello <-

 

Numbers

Basic number formatting specifiers:ui

 

 

Specifier Type Format

Output
(Passed
Double 1.42)
this

Output
(Passed
Int -12400)
spa

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

 

Custom number formatting:orm

 

 

Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42
. Decimal point {0:0.0} 1500.4
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.
; Group separator see below
 

 

The group separator is especially useful for formatting currency values which require that negative values be enclosed in parentheses. This currency formatting example at the bottom of this document makes it obvious:htm

Dates

Note that date formatting is especially dependant on the system's regional settings; the example strings here are from my local locale.

 

 

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

 

The 'U' specifier seems broken; that string certainly isn't sortable.

Custom date formatting:

 

 

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

 

Enumerations

 

 

Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

 

Some Useful Examples

String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);


This will output "$1,240.00" if passed 1243.50. It will output the same format but in parentheses if the number is negative, and will output the string "Zero" if the number is zero.


String.Format("{0:(###) ###-####}", 18005551212);


This will output "(800) 555-1212".

 

變量.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%

15327190325 zf 474184683 love71mm

 

出處: ttp://www.cnblogs.com/Chinasf/archive/2009/10/11/1580889.html

===========================================================================================

1 前言

   若是你熟悉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方法來格式化。下面的語句會產生一樣的輸出:

public 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獲得一樣的輸出。

string 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或n 用逗號分割千位的數字,好比1234將會被變成1,234
P或p Percentage 百分符號格式
R或r Round-trip  圓整(只用於浮點數)保證一個數字被轉化成字符串之後能夠再被轉回成一樣的數字
X或x Hex 16進制格式

若是咱們使用下面的表達方式,讓咱們看看會發生什麼

public 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
    }
}

精度控制標識控制了有效數字的個數或者十進制數小數的位數。

Console.WriteLine("{0:C5}", i); // ¥123,456.00
Console.WriteLine("{0:D5}", i); // 123456
Console.WriteLine("{0:E5}", i); // 1.23456E+005
Console.WriteLine("{0:F5}", i); // 123456.00000
Console.WriteLine("{0:G5}", i); // 1.23456E5
Console.WriteLine("{0:N5}", i); // 123,456.00000
Console.WriteLine("{0:P5}", i); // 12,345,600.00000 %
Console.WriteLine("{0:X5}", 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方法,它用字符串爲參數,而且返回相等的數值。好比

public 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語句是同樣的

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的引用,而後就可使用不一樣NumberStyles的組合或者其中的任意一種。若是你想兼容貨幣符號,就須要使用重載的Parse方法,它們採用了NumberFormatInfo對象做爲一個參數,而後你能夠設置NumberFormatInfo的CurrencySymbol屬性來調用Parse方法,好比:

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表明了某種特定的文化,包括文化的名字,書寫的方式,日曆的格式。對於某種特定文化的操做是很是廣泛的狀況,好比格式化日期和排序。文化的命名方式聽從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: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(年月模式)

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/),轉載和引用請註明做者及出處。
 *二、本文必須全文轉載和引用,任何組織和我的未受權不能修改任何內容,而且未受權不可用於商業。
 *三、本聲明爲文章一部分,轉載和引用必須包括在原文中。
 ******************************************************************************************/

出處:http://www.cnblogs.com/FlyingBread/archive/2007/01/18/620287.html

相關文章
相關標籤/搜索