在 string.format 中设置占位符的格式以选取参数的子字符串
本文关键字:选取 参数 字符串 格式 format 设置 占位符 string | 更新日期: 2023-09-27 17:56:25
相应参数中选取子字符串的 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
方法。我也读过那个字符串。格式比简单的子字符串慢。上面的例子经过了大量简化。想象一下字符串。格式语句驻留在一个地方,而lang1
/lang2
参数是来自另一个地方的输入,shortFormat
/longFormat
在resx文件中定义。
也就是说,在要定义格式的地方,我们对要格式化的值一无所知(示例中为 lang1/lang2),也没有任何方法来执行 C# 代码。因此,我们不能调用任何方法,例如对值Substring
。反过来,在格式化代码运行的地方,我们将格式作为参数,因此我们不能简单地对值执行Substring
,因为我们不知道格式是否需要它(除非我们检查格式)。
不,string.Format
没有此功能,在这里可以更好地解释:是否可以像在 C printf 中那样在 C# 格式字符串中定义最大字符数?
如果您不想使用Substring
我会为string
创建一个扩展类,如下所示:http://msdn.microsoft.com/en-us/library/bb311042.aspx
namespace CustomExtensions
{
public static class StringExtension
{
public static string ShortFormat(this string str)
{
// manipulate and return str here
}
public static string LongFormat(this string str)
{
// manipulate and return str here
}
}
}
XSLT 格式可以是一个选项:用户可以在配置文件中提供几乎所有内容,如果需要,甚至可以在域中执行自定义 C# 代码。
还请考虑格式的更改可以限制为相对少量的动作:裁剪,填充或在某些位置插入一两个内容。每个都可以设置为单独的函数,并提供自己的参数。
有两种方法可以提供自定义格式。可以在自定义类型上实现IFormattable
以控制始终设置该类型的格式,也可以实现IFormatProvider
以在特定情况下重写其他类型的格式设置方式。
在您的情况下,我建议创建一个新类型来封装您的软件如何处理语言代码;
public struct LanguageCode : IFormattable {
public readonly string Code;
public LanguageCode(string code) {
Code = code;
}
public override string ToString()
=> this.ToString("L", CultureInfo.CurrentCulture);
public string ToString(string format)
=> this.ToString(format, CultureInfo.CurrentCulture);
public string ToString(string format, IFormatProvider provider){
if (String.IsNullOrEmpty(format))
format = "L";
if (provider == null)
provider = CultureInfo.CurrentCulture;
switch (format.ToUpperInvariant()){
case "L": // Long
return Code.ToString(provider);
case "S": // Short
return Code.SubString(0,1).ToString(provider);
default:
throw new FormatException($"The {format} format string is not supported.");
}
}
public static implicit operator LanguageCode(string code)
=> new LanguageCode(code);
public static implicit operator string(LanguageCode language)
=> language.Code;
}
然后从你的例子;
var lang1 = (LanguageCode)"EN";
LanguageCode lang2 = "FR";
var shortFormat = "Foo-{0:S}.pdf";
var longFormat = "Foo-{0:L}.pdf";