C# - ToString方法的數值格式化與日期格式化

在許多程式語言中,String通常是系統與User之間的資料傳輸類型,不管是User輸入還是系統輸出,或者是資料轉換,都常用到String,所以String的雙向轉換是蠻重要的一環。
在本篇文章中,限量會先介紹其他資料型態轉String的方向,其中值得關注的是DateTime轉String與數值資料型態(decimal, int, float...)轉String的方法。

每種程式語言遇到資料型態轉String的情況時,都有各自的處理方式,像Java與C#有提供ToString()的方法,而C++就必須額外處理。基本上,Java與C#再轉換成String時只要呼叫此資料型態所繼承的ToString()方法就直接轉為String型別,但一些有複雜格式的資料型態,如float, double, decimal, DateTime等可以有許多種格式,像float, double有小數點位數的問題,DateTime有顯示格式的問題(yyyy/MM/dd 或yyyy-MM-dd...等),舉例來說,Java在小數點格式化時要先new一個DecimalFormat物件,在使用format物件的format()方法,DateTime顯示格式時則用SimpleDateFormat物件,相較之下,C#提供的ToString()比較多元,只要在ToString()裡加入格式的相關參數就能輸出我們所想要的格式字串。

本篇將著重在日期格式與數值格式字串的轉換:

日期格式字串

格式是以單一英文字母代表,只要在ToString()中加入代碼就會輸出該格式的字串,以下為C#提供的格式代碼:


格式代號
描述
格式(zh-TW)
d
簡短日期
yyyy/MM/dd
D
完整日期
yyyy年MM月dd日
f
完整日期時間
yyyy年MM月dd日 tt hh:mm
F
完整日期時間(含秒)
yyyy年MM月dd日 tt hh:mm:ss
g
簡短日期時間
yyyy/MM/dd tt hh:mm
G
簡短日期時間(含秒)
yyyy/MM/dd tt hh:mm:ss
m
月份日期
MM月dd日
M
同m

o
國際標準時間加時區
yyyy-MM-ddThh:mm:dd.fffffffzzz
O
同o

r
RFC時間格式
EX: Sat, 22 Mar 2014 19:43:23 GMT
R
同r

s
可排序日期時間
yyyy-MM-ddThh:mm:dd
t
簡短時間模式
tt hh:mm
T
完整時間模式
tt hh:mm:ss
u
國際可排序日期時間
yyyy-MM-dd hh:mm:ddZ
U
國際完整日期時間
yyyy年MM月dd日 tt hh:mm:ss
y
年月
yyyy年MM月
Y
同y


上表中紅色字體的部分涉及較複雜的格式操作,在這裡便不多做說明,接著以下的程式碼會將現在時間轉換成各種格式字串提供大家參考:


using System;
using System.Linq;

namespace ConsoleTest
{
 class Program
 {
  static void Main( string[] args )
  {
   var d = DateTime.Now;
   string[] formatArray = {"d", "D", "f", "F", "g", "G", "M", "m", "O", "o", "R", "r", "s", "t"
    , "T", "u", "U", "y", "Y"};
   Console.WriteLine( "DateTime String Format: " );
   formatArray.ToList().ForEach( s =>
   {
    Console.WriteLine( String.Format( "{0} => {1}", s, DateTime.Now.ToString( s ) ) );
   } );
  }

 }
}


執行結果:


數值格式字串


格式代號
描述
C, c
轉為貨幣格式($, NT...)
D, d
轉為Decimal格式
E, e
將小數點後轉為指數模式
F, f
轉換成浮點數格式(EX: F4(小數點後4位))
G, g
轉換成浮點數或指數格式(視精簡度)
N, n
轉換成帶分隔符號
P, p
轉換為百分比
R, r
轉換對應型別數字數量(只支援Double, Single, BigInteger)
X, x
轉換成16進位

格式轉換程式碼:


using System;
using System.Linq;

namespace ConsoleTest
{
 class Program
 {
  static void Main( string[] args )
  {
   var digit = 12345;
   String[] format = { "C", "D", "E", "F", "G", "N", "P", "X" };
   Console.WriteLine( "Numeric String Format: " );
   format.ToList().ForEach( s =>
   {
    Console.WriteLine( String.Format( "{0} => {1}", s, digit.ToString( s ) ) );
   } );

   double value = Math.PI;
   Console.WriteLine( String.Format( "{0} => {1}", "R", value.ToString( "r" ) ) );
  }

 }
}

執行結果:

雖然有一些格式的解釋不太清楚,但限量認為只要能熟悉應用幾個常用的格式,對以後開發程式會有大大的幫助。

參考來源:
MSDN - 標準日期和時間格式字串
MSDN - 標準數值格式字串

留言

張貼留言