字符串自定义格式化程序 .NET

Posted

技术标签:

【中文标题】字符串自定义格式化程序 .NET【英文标题】:String custom formatter .NET 【发布时间】:2021-11-28 09:14:16 【问题描述】:

自定义格式字符串有一个问题。 我想做这样的事情:

var str = "SOME_ORIGINAL_FIELD_NAME";
var format1 = "XX_X_X";
var format2 = "X_XXX";

var strFormat1 = String.Format(str, format1); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = String.Format(str, format2); // SOME_ORIGINALFIELDNAME

有人知道正确的搜索方向吗?也许我应该看看 IFormatProvider 和 ICustomFormatter 方面。

【问题讨论】:

你能清楚地提供预期的输入和输出吗? 输入:字符串 = "SOME_ORIGINAL_FIELD_NAME";格式 = "XX_X_X";输出:字符串 = “SOMEORIGINAL_FIELD_NAME”。每个“X”都是单词。我想删除像 at pattern 这样的单词之间的下划线。 【参考方案1】:

当然,您只需:

将源字符串拆分为其组件, 使用i 占位符而不是X,并且 将参数反转为String.Format(格式在前,数据在后)。

示例代码(fiddle):

var components = "SOME_ORIGINAL_FIELD_NAME".Split('_');
var format1 = "01_2_3";
var format2 = "0_123";

var strFormat1 = String.Format(format1, components); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = String.Format(format2, components); // SOME_ORIGINALFIELDNAME

【讨论】:

+1 用于非正则表达式解决方案 - 即使 format1format2 已更改,OP 可能也有相同的意图【参考方案2】:

用连续的占位符替换格式字符串中的X,并将输入的字符串值拆分成字符串数组,然后应用string.Format()

public static string FormatSplitAndJoin(string input, string formatTemplate, string delimiter = "_", string placeholder = "X")

    // split "a_b_c" into ["a", "b", "c"]
    var parts = input.Split(delimiter);

    // turn "X_X_X" into "0_1_2"
    var index = 0;
    var formatString = Regex.Replace(formatTemplate, placeholder, m => string.Format("0", index++));

    // validate input length
    if(index > parts.Length)
        throw new ArgumentException(string.Format("input string resulted in fewer arguments than expected, 0 placeholders found", index));

    // apply string.Format()
    return string.Format(formatString, parts);

现在你可以这样做了:

var str = "SOME_ORIGINAL_FIELD_NAME";
var format1 = "XX_X_X";
var format2 = "X_XXX";

var strFormat1 = FormatSplitAndJoin(str, format1); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = FormatSplitAndJoin(str, format2); // SOME_ORIGINALFIELDNAME

【讨论】:

以上是关于字符串自定义格式化程序 .NET的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 中使用自定义格式对 TimeSpan 对象进行 String.Format ?

.NET 自定义Json序列化时间格式

模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)

如何将 .NET 标准格式字符串转换为 Excel 格式字符串

百度输入法输出自定义格式化时间字符串(拿来主义)

如何在 Eclipse 格式化程序中为二进制操作保留自定义缩进