字符串自定义格式化程序 .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 用于非正则表达式解决方案 - 即使format1
和 format2
已更改,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 ?
模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)