心如止水

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IFormatProvider接口

首先介绍String.Format(IFormatProvider, string format, Object[] args)方法,其中args参数指定待format的参数列表。format参数指定格式,format参数的语法格式如下:

{index[,alignment][:formatString]}

Index是从0开始的int数,对应args列表中的参数,例如:

string str1 = string.Format("{0} is a student", "li");

string str2= string.Format("{0} and {1} are students", new object[] { "li", "liu" });

str1li is a student,str2li and liu are students

alignment指示这个被format的结果的最小宽度,是一个int型数,当formatted value的长度

小于最小宽度时,该值为正数,则在结果的左边补齐空格,负数则右边补齐空格,例如:

string str3 = string.Format("{0,-8}", "my");

str3"my "

formatString是一个用于自定义format格式的参数,看下面的例子:

public class AcctNumberFormat : IFormatProvider, ICustomFormatter

{

private const int ACCT_LENGTH = 12;

 

public object GetFormat(Type formatType)

{

if (formatType == typeof(ICustomFormatter))

return this;

else

return null;

}

 

public string Format(string fmt, object arg, IFormatProvider formatProvider)

{

// Convert argument to a string

string result = arg.ToString();

 

// If account number is less than 12 characters, pad with leading zeroes

if (result.Length < ACCT_LENGTH)

result = result.PadLeft(ACCT_LENGTH, '0');

// If account number is more than 12 characters, truncate to 12 characters

if (result.Length > ACCT_LENGTH)

result = result.Substring(0, ACCT_LENGTH);

 

// Add hyphens for formatting code "H"

if (!String.IsNullOrEmpty(fmt) && fmt.ToUpper() == "H")

return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);

// Return string representation of argument for any other formatting code

else

return result;

}

调用的地方如下:

long acctNumber;

 

acctNumber = 104254567890;

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0:H}", acctNumber));

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0}", acctNumber));

acctNumber = 14567890;

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0:H}", acctNumber));

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0}", acctNumber));

acctNumber = 18779887654111;

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0:H}", acctNumber));

Console.WriteLine(String.Format(new AcctNumberFormat(), "{0}", acctNumber));

当格式为"{0:H}"的时候,传递给public string Format(string fmt, object arg, IFormatProvider formatProvider)方法的fmt参数的值就为"H",当为"{0}"的时候,fmt值就为null。本例的输出结果如下:

10425-456-7890

104254567890

00001-456-7890

000014567890

18779-887-6541

187798876541

IFormatProvider已经被DateTimeFormatInfoNumberFormatInfoCultureInfo实现了,而且CultureInfo提供了DateTimeFormatNumberFormat分别对该Culture所对应的这两个属性的操作。

NumberFormatInfo类:

在该类中提供了许多Format patten,以及和该pattern对应的属性,例如:

Format pattencC,指定为货币格式,对应的属性有CurrencyNegativePatternCurrencySymbol等。如下设置负数的时候为一种特殊的格式:

_nfi = new NumberFormatInfo();

//_nfi.CurrencySymbol=Application.CurrentCulture.NumberFormat.CurrencySymbol;

_nfi.CurrencyNegativePattern = 10; //eg.1.1显示为 1.1 $-

我们应用它的时候要同时指定FormatFormatInfo属性,例如:

this.ultraGrid1.DisplayLayout.Bands[0].Columns["Price"].Format = "C"; // currency type

this.ultraGrid1.DisplayLayout.Bands[0].Columns["Price"].FormatInfo = _nfi;

同样,对于DataTime类型,我们也可以这样设置不同的格式。

posted on 2008-11-03 16:15  cutebear  阅读(13548)  评论(5编辑  收藏  举报