zoukankan      html  css  js  c++  java
  • 点滴拾遗

    点击下载示例代码

    String.Format 一重载方法的签名如下

    1 public static string Format(
    2     IFormatProvider provider,
    3     string format,
    4     params Object[] args
    5 )

    可以通过自定义 IFormatProvider 接口来控制 String.Format 执行过程中的特定行为。

    过程如下

    1, 自定义类实现 IFormatProvider 接口(object GetFormat 方法)

    1 public object GetFormat(Type formatType)
    2 {
    3     if (formatType == typeof(ICustomFormatter))
    4         return this;
    5     else
    6         return null;
    7 }

    2, 实现 ICustomFormatter 借口(string Format 方法)

    摘自 MSDN。功能为控制 Int64 type 的string输出。

     1 public string Format(string fmt, object arg, IFormatProvider formatProvider)
     2 {
     3     // Provide default formatting if arg is not an Int64. 
     4     if (arg.GetType() != typeof(Int64))
     5         try
     6         {
     7             return HandleOtherFormats(fmt, arg);
     8         }
     9         catch (FormatException e)
    10         {
    11             throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
    12         }
    13 
    14     // Provide default formatting for unsupported format strings. 
    15     string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
    16     if (!(ufmt == "H" || ufmt == "I"))
    17         try
    18         {
    19             return HandleOtherFormats(fmt, arg);
    20         }
    21         catch (FormatException e)
    22         {
    23             throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
    24         }
    25 
    26     // Convert argument to a string. 
    27     string result = arg.ToString();
    28 
    29     // If account number is less than 12 characters, pad with leading zeroes. 
    30     if (result.Length < ACCT_LENGTH)
    31         result = result.PadLeft(ACCT_LENGTH, '0');
    32     // If account number is more than 12 characters, truncate to 12 characters. 
    33     if (result.Length > ACCT_LENGTH)
    34         result = result.Substring(0, ACCT_LENGTH);
    35 
    36     if (ufmt == "I")                    // Integer-only format.  
    37         return result;
    38     // Add hyphens for H format specifier. 
    39     else                                          // Hyphenated format. 
    40         return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
    41 }

    使用实现好的 Format 类

     1 long acctNumber;
     2 double balance;
     3 DaysOfWeek wday;
     4 string output;
     5 
     6 acctNumber = 104254567890;
     7 balance = 16.34;
     8 wday = DaysOfWeek.Monday;
     9 
    10 output = String.Format((new AcctNumberFormat(),
    11                        "On {2}, the balance of account {0:H} was {1:C2}.",
    12                        acctNumber, balance, wday);
    13 Console.WriteLine(output);

    执行结果如下

    参考资料

    Culture invariant Decimal.TryParse()  http://stackoverflow.com/questions/23131414/culture-invariant-decimal-tryparse

    What does IFormatProvider do?  http://stackoverflow.com/questions/506676/what-does-iformatprovider-do

    IFormatProvider Interface  https://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

  • 相关阅读:
    Handler详细说明系列(六)——View的post()详解
    2013年6月17日星期一
    2013年6月16日星期日
    线程管理四种方法
    java 线程 ProducerAndConsumer
    POJ 2948 DP
    Java的递归算法
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    网络安全审查制度即将推出 手机App安全加密成必定趋势
    递归算法浅谈
  • 原文地址:https://www.cnblogs.com/isun/p/4703605.html
Copyright © 2011-2022 走看看