• 点滴拾遗


    点击下载示例代码

    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

  • 相关阅读:
    [leetcode]存在重复
    [leetcode]旋转数组
    git使用方法(持续更新)
    [LeetCode]从排序数组中删除重复项
    Communications link failure--分析之(JDBC的多种超时情况)
    云主机挂载磁盘
    hadoop对于压缩文件的支持
    linux 转移mysql文件操作流程
    MindManager2018 修改过期时间 配置文件路径
    Innodb 中 RR 隔离级别能否防止幻读?
  • 原文地址:https://www.cnblogs.com/isun/p/4703605.html
Copyright © 2020-2023  润新知