C# 格式化string.Format中的占位符以拾取参数的子字符串

C# 格式化string.Format中的占位符以拾取参数的子字符串,c#,string-formatting,C#,String Formatting,C string.format方法是否有从相应参数中选取子字符串的格式字符串?像这样: var lang1 = "EN"; var lang2 = "FR"; var shortFormat = "Foo-{0:0-0}.pdf"; var longFormat = "Foo-{0:0-1}.pdf"; string.Format(shortFormat, lang1) // Foo-E.pdf string.Format(shortFormat, lang2) // Foo-F.pdf s

C string.format方法是否有从相应参数中选取子字符串的格式字符串?像这样:

var lang1 = "EN";
var lang2 = "FR";

var shortFormat = "Foo-{0:0-0}.pdf";
var longFormat = "Foo-{0:0-1}.pdf";

string.Format(shortFormat, lang1) // Foo-E.pdf
string.Format(shortFormat, lang2) // Foo-F.pdf
string.Format(longFormat, lang1) // Foo-EN.pdf
string.Format(longFormat, lang2) // Foo-FR.pdf
期待一些评论:是的,我知道Substring方法。我也读过这个字符串。格式比简单的子字符串慢。上面的例子大大简化了。假设string.Format语句位于一个位置,而lang1/lang2参数是来自另一个位置的输入,而shortFormat/longFormat是在resx文件中定义的

也就是说,在定义格式的地方,我们对示例中格式化为lang1/lang2的值一无所知,也没有任何方法来执行C代码。因此,我们不能对值调用任何方法,如Substring。反过来,在格式化代码运行的地方,我们将格式作为参数,因此我们不能简单地对值执行子字符串,因为我们不知道格式是否需要它,除非我们检查格式。

否,string.format没有此功能,这里更好地解释了这一点:

如果您不想使用子字符串,我将为字符串创建一个扩展类,如下所示:

可以是一种选择:用户可以提供配置文件中的几乎所有内容,甚至在需要时在您的域中执行自定义c代码


请注意,格式的变化可以限制在相对较小的动作量上:在某个位置上有一个或两个东西。每一个都可以设置为单独的函数并提供自己的参数。

有两种方法可以提供自定义格式。您可以在自定义类型上实现IFormattable以控制该类型的格式化方式,也可以实现IFormatProvider以覆盖其他类型在特定情况下的格式化方式

在您的情况下,我建议创建一个新类型来封装您的软件如何处理语言代码

公共结构语言代码:IFormattable{ 公共只读字符串代码; 公共语言代码字符串代码{ 代码=代码; } 公共重写字符串ToString =>this.toString、CultureInfo.CurrentCulture; 公共字符串到字符串字符串格式 =>this.toString格式,CultureInfo.CurrentCulture; 公共字符串到字符串字符串格式,IFormatProvider{ 如果String.IsNullOrEmptyformat 格式=L; 如果提供程序==null provider=CultureInfo.CurrentCulture; switch format.toupper不变量{ 案例L://长 返回代码.ToStringprovider; 案例S://Short 返回代码.SubString0,1.ToStringprovider; 违约: 抛出新FormatException$不支持{format}格式字符串。; } } 公共静态隐式运算符语言CODESTRING代码 =>新语言编码; 公共静态隐式运算符stringLanguageCode语言 =>语言.代码; } 然后从你的例子

   var lang1 = (LanguageCode)"EN";
   LanguageCode lang2 = "FR";

   var shortFormat = "Foo-{0:S}.pdf";
   var longFormat = "Foo-{0:L}.pdf";

谢谢你的回答。我很害怕。至于扩展方法的建议-我认为这仍然不能解决我的问题,正如我在预期部分中提到的:在定义格式的地方,例如在resx文件中,值是未知的。这就是为什么不能为子字符串或其上的任何扩展方法访问它。哦,好的。那就很难了=/
   var lang1 = (LanguageCode)"EN";
   LanguageCode lang2 = "FR";

   var shortFormat = "Foo-{0:S}.pdf";
   var longFormat = "Foo-{0:L}.pdf";