您的位置:首页 > 编程语言 > PHP开发

IFormatProvider接口

2013-11-14 19:34 211 查看
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" });

则str1为li is a student,str2为li 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已经被DateTimeFormatInfo、NumberFormatInfo、CultureInfo实现了,而且CultureInfo提供了DateTimeFormat和NumberFormat分别对该Culture所对应的这两个属性的操作。

NumberFormatInfo类:

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

Format patten为c或C,指定为货币格式,对应的属性有CurrencyNegativePattern,CurrencySymbol等。如下设置负数的时候为一种特殊的格式:

_nfi = new NumberFormatInfo();

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

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

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

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

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

同样,对于DataTime类型,我们也可以这样设置不同的格式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: