将 C# 中的字符串(不是数字或日期)格式化为给定模式

Format a string in C# (not number or date) to a given pattern

是否有类似 string.format 的格式化字符串,我可以在其中传递目标模式。 string.format 似乎仅用于格式化数字和模式以及在给定位置内插入值。在给定模式后格式化字符串是否有比自己编程的通用解决方案?

我想给出目标模式和输入字符串,然后按照我提供的模式输出字符串。

我可以举一些例子。

Input               Output           Input pattern (idea)
---------------------------------------------------------
123.456.001         00123.456.001    00000.000.###
D1234567            D-123-4567       D-000-#### (where D is literal)

所以,我的问题是:有没有一种方法可以将 string 格式化为给定的模式,就像数字和日期一样?

String.Format() 这真的不可能。您需要使用正则表达式或类似表达式来剖析模式的不同部分。

对于您的示例,解决方案可能是

public string ReplacePattern(string input)
{
    var match = Regex.Match(input, @"([A-Z])(\d{3})(\d{4})");
    if(match.Groups.Count == 4) // The first group is always the input
    {
        return String.Format("{0}-{1}-{2}", match.Groups.Skip(1).Take(3).ToArray());
    }
    return "";
}

编辑:我忘了:当然你总是可以使用正则表达式替换:

public string ReplacePattern(string input)
{
    return Regex.Replace(input, @"([A-Z])(\d{3})(\d{4})", "--");
}

我会考虑为您需要的每种不同格式制作客户格式化程序 类。下面有一个非常简单的示例,没有错误处理等...

// custom formatter class
public class FormatD : IFormattable
{
    public string ToString(string format, IFormatProvider provider)
    {
        return format[0] + "-" + format.Substring(1,3) + "-" + format.Substring(4);
    }
}

致电:

 var input = "D1234567";
 var ouput = String.Format("{0:" + input + "}", new FormatD());