欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 格式化字符串的實現(xiàn)代碼

 更新時間:2016年11月30日 23:21:11   投稿:mdxy-dxy  
這篇文章主要介紹了C# 格式化字符串的實現(xiàn)代碼,需要的朋友可以參考下

1 前言

   如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串類,那么你對String.Format方法肯定很熟悉。在C#中也經(jīng)常使用這個方法來格式化字符串,比如下面這樣:

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

也許你的機器上的輸出和這個不太一樣。這是正常的,本文稍后就會解釋這個問題。

在我們?nèi)粘J褂弥校嗟氖鞘褂肅onsole.WriteLine方法來輸出一個字符串。其實String.Format和Console.WriteLine有很多共同點。兩個方法都有很多重載的格式并且采用無固定參數(shù)的對象數(shù)組作為最后一個參數(shù)。下面的兩個語句會產(chǎn)生同樣的輸出。

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都遵守同樣的格式化規(guī)則。格式化的格式如下:"{ N [, M ][: formatString ]}", arg1, ... argN,在這個格式中:

1) N是從0開始的整數(shù),表示要格式化的參數(shù)的個數(shù)

2) M是一個可選的整數(shù),表示格式化后的參數(shù)所占的寬度,如果M是負數(shù),那么格式化后的值就是左對齊的,如果M是正數(shù),那么格式化后的值是右對齊的

3) formatString是另外一個可選的參數(shù),表示格式代碼

argN表示要格式化的表達式,和N是對應的。

如果argN是空值,那么就用一個空字符串來代替。如果沒有formatString,那么就用參數(shù)N對應的ToString方法來格式化。下面的語句會產(chǎn)生同樣的輸出:

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)決定了如何格式化數(shù)據(jù),比如用貨幣符號,科學計數(shù)法或者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 格式化標識符

標準的數(shù)學格式字符串用于返回通常使用的字符串。它們通常象X0這樣的格式。X是格式化標識符,0是精度標識符。格式標識符號共有9種,它們代表了大多數(shù)常用的數(shù)字格式。就像下表所示:

字母  含義
C或c Currency 貨幣格式
D或d Decimal 十進制格式(十進制整數(shù),不要和.Net的Decimal數(shù)據(jù)類型混淆了)
E或e Exponent 指數(shù)格式
F或f Fixed point 固定精度格式
G或g General 常用格式
N或n 用逗號分割千位的數(shù)字,比如1234將會被變成1,234
P或p Percentage 百分符號格式
R或r Round-trip  圓整(只用于浮點數(shù))保證一個數(shù)字被轉化成字符串以后可以再被轉回成同樣的數(shù)字
X或x Hex 16進制格式

如果我們使用下面的表達方式,讓我們看看會發(fā)生什么

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

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

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(圓整)格式僅僅對浮點數(shù)有效。這個值首先會用通用格式來格式化。對于雙精度數(shù)有15位精度,對于單精度數(shù)有7位精度。如果這個值可以被正確地解析回原始的數(shù)字,就會用通用格式符來格式化。如果不能解析回去的話,那么就會用17位精度來格式化雙精度數(shù),用9位精度來格式化單精度數(shù)。盡管我們可以在圓整標識符后面添加有效數(shù)字的位數(shù),但是它會被忽略掉。

double d = 1.2345678901234567890;
Console.WriteLine("Floating-Point:\t{0:F16}", d); // 1.2345678901234600
Console.WriteLine("Roundtrip:\t{0:R16}", d);  // 1.2345678901234567

如果標準格式化標識符還不能滿足你。你可以使用圖形化格式字符串來創(chuàng)建定制的字符串輸出。圖形化格式化使用占位符來表示最小位數(shù),

最大位數(shù),定位符號,負號的外觀以及其它數(shù)字符號的外觀。就像下表所示

符號 名稱 含義
0 0占位符 用0填充不足的位數(shù)
# 數(shù)字占位符 用#代替實際的位數(shù)
. 十進制小數(shù)點  
, 千位分隔符 用逗號進行千位分割,比如把1000分割成1,000
% 百分符號 顯示一個百分標識
E+0
E-0
e+0
e-0
指數(shù)符號 用指數(shù)符號格式化輸出
\ 專一字符 用于傳統(tǒng)格式的格式化序列,比如"\n"(新行)
'ABC'
"ABC"
常量字符串  顯示單引號或者雙引號里面的字符串
; 區(qū)域分隔符  如果數(shù)字會被格式化成整數(shù),負數(shù),或者0,用;來進行分隔
,. 縮放符號 數(shù)字除以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 數(shù)字字符串的解析

所有的基礎類型都有ToString方法,它是從object類型中繼承過來的。所有的數(shù)值類型都有Parse方法,它用字符串為參數(shù),并且返回相等的數(shù)值。比如

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

在缺省狀況下,某些非數(shù)字字符是可以存在的。比如開頭和結尾的空白。逗號和小數(shù)點,加號和減號,因此,下面的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對象作為一個參數(shù),然后你可以設置NumberFormatInfo的CurrencySymbol屬性來調(diào)用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>-<國家/地區(qū)碼2>的方式,其中的<語言代碼2>是兩個小寫的字母,它們來自ISO639-1;<國家/地區(qū)碼2>是兩個大寫字母,它們來自ISO3166。比如,美國英語是“en-US"。英國英語是"en-GB"。特立尼達和多巴哥英語是"en-TT"。例如,我們可以創(chuàng)建一個美國英語的CultureInfo對象并且基于這種文化將數(shù)字轉換成字符串。

int k = 12345;
CultureInfo us = new CultureInfo("en-US");
string v = k.ToString("c", us);
Console.WriteLine(v);

輸出是:

$12,345.00

要注意到,我們使用了重載的ToString方法,它把第一個格式化字符串當成第一個參數(shù),將一個CultureInfo對象(執(zhí)行了IFormatProvider對象)作為第二個參數(shù)。這兒有第二個例子,對于丹麥人來說:

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);
 }
}

代碼會產(chǎn)生下面的輸出

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實例,它與文化無關。你可以創(chuàng)建自定義的模式。要注意到的是InvariantInfo不一定和本地的格式一樣。Invariant等于美國格式。另外,如果你向DateTime.Format方法傳遞的第二個參數(shù)是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】:
*1、本文為原創(chuàng)技術文章,首發(fā)博客園個人站點(http://flyingbread.cnblogs.com/),轉載和引用請注明作者及出處。
*2、本文必須全文轉載和引用,任何組織和個人未授權不能修改任何內(nèi)容,并且未授權不可用于商業(yè)。
*3、本聲明為文章一部分,轉載和引用必須包括在原文中。
******************************************************************************************/

相關文章

  • C# Winform下載文件并顯示進度條的實現(xiàn)代碼

    C# Winform下載文件并顯示進度條的實現(xiàn)代碼

    本來是要研究怎樣判斷下載完成,結果找到這個方法,可以在這個方法完成之后提示下載完成,需要的朋友可以參考下
    2014-07-07
  • C#中overrid和new修飾符有什么不同

    C#中overrid和new修飾符有什么不同

    在C#的繼承中嘗嘗會用到相關的修飾詞:override和new。這兩個修飾符都可以在新的子類中,重寫同名的父類方法。下面通過本文給大家介紹C#中overrid和new修飾符的區(qū)別,感興趣的朋友一起看看吧
    2018-02-02
  • C#實現(xiàn)窗體間傳值實例分析

    C#實現(xiàn)窗體間傳值實例分析

    這篇文章主要介紹了C#實現(xiàn)窗體間傳值的方法,結合實例形式較為詳細的分析了C#針對窗體間傳值的處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#中類與接口的區(qū)別講解

    C#中類與接口的區(qū)別講解

    本文詳細講解了C#中類與接口的區(qū)別,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • NPOI實現(xiàn)兩級分組合并功能(示例講解)

    NPOI實現(xiàn)兩級分組合并功能(示例講解)

    下面小編就為大家分享一篇NPOI實現(xiàn)兩級分組合并功能的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#泛型集合類型實現(xiàn)添加和遍歷

    C#泛型集合類型實現(xiàn)添加和遍歷

    這篇文章介紹了C#泛型集合類型實現(xiàn)添加和遍歷的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C#實現(xiàn)自定義Dictionary類實例

    C#實現(xiàn)自定義Dictionary類實例

    這篇文章主要介紹了C#實現(xiàn)自定義Dictionary類,較為詳細的分析了Dictionary類的功能、定義及用法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#命令行編譯器配置方法

    C#命令行編譯器配置方法

    這篇文章主要介紹了C#命令行編譯器配置方法,本文講解了配置C#命令行編譯器、配置其它.NET命令行工具、通過csc命令行編譯器來編譯C#文件實例等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • C#使用oledb導出數(shù)據(jù)到excel的方法

    C#使用oledb導出數(shù)據(jù)到excel的方法

    這篇文章主要介紹了C#使用oledb導出數(shù)據(jù)到excel的方法,結合實例形式分析了C#操作oledb導出數(shù)據(jù)的相關技巧與注意事項,需要的朋友可以參考下
    2016-06-06
  • Unity3D實現(xiàn)播放gif圖功能

    Unity3D實現(xiàn)播放gif圖功能

    這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)播放gif圖功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論