在 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 中设置占位符的格式以选取参数的子字符串

不,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";