DateTime.ToString格式限定符转义

DateTime.Now.ToString("yyyy-MM-dd")

上边代码结果为:2011-08-03,其中y、M、d即为格式限定符,他们在DateTime.ToString具有限定格式意义,但在一些场合中我们希望这些字符能直接输出,即暂时取消格式限定符的作用,这就需要转义。

一、DateTime.ToString格式限定符转义

1.单个格式限定符转义

DateTime.Now.ToString("year:yyyy")  //11ear:2011
DateTime.Now.ToString(@"\year:yyyy")  //year:2011

可见,单个格式限定符转义只需在格式限定符前加"\"即可。

2.多个格式限定符转义

DateTime.Now.ToString("date:yyyy")    //3a下e:2011
DateTime.Now.ToString("'date':yyyy")    //year:2011
DateTime.Now.ToString("\"date\":yyyy")    //year:2011

可见,将多个连续的字符放在单/双引号中可实现批量转义。

二、转义实现解析

使用Reflector查看DateTime.ToString方法,最终转到DateTimeFormat.FormatCustomized方法上,该方法相关代码片断如下:

case '\\':
    {
        num4 = ParseNextChar(format, i);
        if (num4 < 0)
        {
            throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
        }
        outputBuffer.Append((char)num4);
        num2 = 2;
        continue;
    }
case '\'':
case '"':
    {
        StringBuilder result = new StringBuilder();
        num2 = ParseQuoteString(format, i, result);
        outputBuffer.Append(result);
        continue;
    }

DateTimeFormat类中与上述代码相关的两个方法:
private static int ParseNextChar(string format, int pos)
{
    if (pos >= (format.Length - 1))
    {
        return -1;
    }
    return format[pos + 1];
}

internal static int ParseQuoteString(string format, int pos, StringBuilder result)
{
    int length = format.Length;
    int num2 = pos;
    char ch = format[pos++];
    bool flag = false;
    while (pos < length)
    {
        char ch2 = format[pos++];
        if (ch2 == ch)
        {
            flag = true;
            break;
        }
        if (ch2 == '\\')
        {
            if (pos >= length)
            {
                throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
            }
            result.Append(format[pos++]);
        }
        else
        {
            result.Append(ch2);
        }
    }
    if (!flag)
    {
        throw new FormatException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Format_BadQuote"), new object[] { ch }));
    }
    return (pos - num2);
}


评论: 0 | 引用: 0 | 查看次数: 4457
发表评论
登录后再发表评论!