.NET Framework提供了方法,能夠將任何數值、枚舉以及日期和時間等基數據類型表示爲字符串
格式化由格式說明符字符的字符串控制,該字符串指示如何表示基類型值
例如,格式說明符指示:是否應該用科學記數法來表示格式化的數字
例如:格式字符"C",說明貨幣格式
同時.NET Framework還使用區域性設置,以便用適合於特定區域性的形式表示基類型。
我們可以提供自定義的區域性設置,或者使用與當前線程關聯的默認區域性設置。
例如,格式化貨幣類型的時候,區域性設置指定用於貨幣符號
要是我們想擁有自己定義的格式化,.NET Framework也允許我們定義自己格式化方案和自定義區域性設置。
例如:我想格式字符"MyFormat",來說明我自定義的格式,即在字符前加三個***
關於數字格式字符串,可以參考類
System.Globalization.NumberFormatInfo
關於日期與時間格式字符串,可以參考類
System.Globalization.DateTimeFormatInfo
先看看IFormattable接口的原型
public interface IFormattable
{
// Methods
string ToString(string format, IFormatProvider formatProvider);
}
參數說明:
format
指定要使用的格式的 String
當爲空引用時,表示使用爲 IFormattable 實現的類型定義的默認格式
formatProvider
用於格式化該值的 IFormatProvider
當爲空引用時,從操作系統的當前區域設置中獲取格式信息的
一些基本的值類型實現了該接口,例如:
Int32 ,UInt32 , DateTime ,Guid ,類Enum
再看看IFormatProvider接口的原型
public interface IFormatProvider
{
// Methods
object GetFormat(Type formatType);
}
參數說明:
formatType
一個對象,它指定要獲取的格式對象的類型
NumberFormatInfo、DateTimeFormatInfo和CultureInfo實現IFormatProvider接口
NumberFormatInfo提供數字格式信息,如用於小數分隔符和千位分隔符的字符,以及貨幣值中貨幣符號的拼寫和位置
DateTimeFormatInfo提供與日期相關和與時間相關的格式信息,如日期模式中月、日和年的位置
CultureInfo包含特定區域性中的默認格式信息,其中包括數字格式信息以及與日期相關和與時間相關的格式信息
再看看ICustomFormatter接口的原型
public interface ICustomFormatter
{
// Methods
string Format(string format, object arg, IFormatProvider formatProvider);
}
參數說明:
format
包含格式規範的格式字符串
arg
要格式化的對象
formatProvider
一個 IFormatProvider 對象,它提供有關當前實例的格式信息
在arg爲空引用時,引發異常
如果 format 爲空引用 ,將使用默認格式規範
如果 formatProvider 爲空引用 ,則忽略該參數
好了,說了這麼多
我們來動手來實現格式字符"MyFormat",在字符前加三個***的需求
namespace MyFormat
{
public class MyClass : System.IFormattable
{
Double d;
public MyClass(Double d)
{
this.d=d;
}
public string ToString(string format, IFormatProvider formatProvider)
{
return (format=="MyFormat")?"***"+d.ToString(formatProvider):d.ToString(format,formatProvider);
}
}
}
MyClass myClass=new MyClass(5);
//當IFormatProvider爲空時,調用的是當前線程關聯的文化信息
Console.WriteLine("顯示中國貨幣格式:{0}",myClass.ToString("C",null));
culture=System.Globalization.CultureInfo.CurrentCulture;
Console.WriteLine("顯示當前系統默認貨幣格式:{0}",myClass.ToString("C",culture));
culture=new System.Globalization.CultureInfo("zh-HK");
Console.WriteLine("顯示香港特別行政區貨幣格式:{0}",myClass.ToString("C",culture));
Console.WriteLine("顯示我自己定義的貨幣格式:{0}",myClass.ToString("MyFormat",null));
Console.ReadLine();
定義一個類
namespace MyFormat
{
public class MyBaseFormat : System.ICustomFormatter, System.IFormatProvider
{
//如果format Type與當前實例類型相同,則爲當前實例,否則爲空引用
public object GetFormat(Type format)
{
if (format == typeof (ICustomFormatter))
return this;
return null;
}
//實現Format方法說明:
//如果您的格式方法不支持格式,則確定正在設置格式的對象是否實現 IFormattable 接口。
//如果實現,請調用該接口的IFormattable.ToString 方法。
//否則,調用基礎對象的默認 Object.ToString 方法。
public string Format (string format, object arg, IFormatProvider provider)
{
if (format == null)
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, provider);
return arg.ToString();
}
else
{
if (format=="MyBaseFormat")
{
return "***"+arg.ToString();
}
else
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, provider);
return arg.ToString();
}
}
}
}
}
int i=100;
MyBaseFormat myBaseFormat=new MyBaseFormat();
printString=string.Format(myBaseFormat,"顯示正常格式:{0}",i);
Console.WriteLine(printString);
printString=string.Format(myBaseFormat,"顯示正常格式:{0:C}",i);
Console.WriteLine(printString);
printString=string.Format(myBaseFormat,"顯示自定義格式{0:MyBaseFormat}",i);
Console.WriteLine(printString);
Console.ReadLine();
1.如果需要您自己的格式化包含在某個類上,在該類上實現IFormattable接口
2.如果希望自定義格式化並使它可供多個不同類使用,那麼實現 ICustomFormatter接口
{
using System;
public class ChineseFormat : System.ICustomFormatter, System.IFormatProvider
{
//如果format Type與當前實例類型相同,則爲當前實例,否則爲空引用
public object GetFormat(Type format)
{
if (format == typeof (ICustomFormatter))
{
return this;
}
return null;
}
//實現Format方法說明:
//如果您的格式方法不支持格式,則確定正在設置格式的對象是否實現 IFormattable 接口。
//如果實現,請調用該接口的IFormattable.ToString 方法。
//否則,調用基礎對象的默認 Object.ToString 方法。
public string Format(string format, object arg, IFormatProvider provider)
{
if (format == null)
{
if (arg is IFormattable)
{
return ((IFormattable) arg).ToString(format, provider);
}
return arg.ToString();
}
else
{
if (format == "ChineseFormat")
{
string[] Nums = new string[] {"零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖"};
//位 數組
string[] Digits = new string[] {"", "拾", "佰", "仟"};
//單位 數組
string[] Units = new string[] {"", "[萬]", "[億]", "[萬億]"};
return ConvertNumberToChinese(arg.ToString(), Nums, Digits, Units);
//return "***"+arg.ToString();
}
else
{
if (arg is IFormattable)
{
return ((IFormattable) arg).ToString(format, provider);
}
return arg.ToString();
}
}
}
public static string ConvertNumberToChinese(string x, string[] Nums, string[] Digits, string[] Units)
{
string S = ""; //返回值
int p = 0; //字符位置指針
int m = x.Length % 4; //取模
// 四位一組得到組數
int k = (m > 0 ? x.Length / 4 + 1 : x.Length / 4);
// 外層循環在所有組中循環
// 從左到右 高位到低位 四位一組 逐組處理
// 每組最後加上一個單位: "[萬億]","[億]","[萬]"
for (int i = k; i > 0; i--)
{
int L = 4;
if (i == k && m != 0)
{
L = m;
}
// 得到一組四位數 最高位組有可能不足四位
string s = x.Substring(p, L);
int l = s.Length;
// 內層循環在該組中的每一位數上循環 從左到右 高位到低位
for (int j = 0; j < l; j++)
{
//處理改組中的每一位數加上所在位: "仟","佰","拾",""(個)
int n = Convert.ToInt32(s.Substring(j, 1));
if (n == 0)
{
if (j < l - 1
&& Convert.ToInt32(s.Substring(j + 1, 1)) > 0 //後一位(右低)
&& !S.EndsWith(Nums[n]))
{
S += Nums[n];
}
}
else
{
//處理 1013 一千零"十三", 1113 一千一百"一十三"
if (!(n == 1 && (S.EndsWith(Nums[0]) | S.Length == 0) && j == l - 2))
{
S += Nums[n];
}
S += Digits[l - j - 1];
}
}
p += L;
// 每組最後加上一個單位: [萬],[億] 等
if (i < k) //不是最高位的一組
{
if (Convert.ToInt32(s) != 0)
{
//如果所有 4 位不全是 0 則加上單位 [萬],[億] 等
S += Units[i - 1];
}
}
else
{
//處理最高位的一組,最後必須加上單位
S += Units[i - 1];
}
}
return S;
}
}
}
namespace Test
{
using System;
using Microshaoft;
class AppTest
{
static void Main()
{
string printString = String.Empty;
long i = 1100000013;
ChineseFormat fmt = new ChineseFormat();
printString = string.Format(fmt, "顯示正常格式: {0}", i);
Console.WriteLine(printString);
printString = string.Format(fmt, "顯示正常格式: {0:C}", i);
Console.WriteLine(printString);
printString = string.Format(fmt, "顯示自定義格式: {0:ChineseFormat}", i);
Console.WriteLine(printString);
Console.ReadLine();
}
}
}