【问题标题】:String custom formatter .NET字符串自定义格式化程序 .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 这样的单词之间的下划线。

标签: c# .net string formatting


【解决方案1】:

当然,您只需:

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

示例代码(fiddle):

var components = "SOME_ORIGINAL_FIELD_NAME".Split('_');
var format1 = "{0}{1}_{2}_{3}";
var format2 = "{0}_{1}{2}{3}";

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

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多