C#自定义字符串对齐方式

本文关键字:方式 对齐 字符串 自定义 | 更新日期: 2023-09-27 18:26:40

我必须管理一个特定的字符串格式化/填充条件。简而言之,只有当参数长度为0时,我才需要填充字符串参数。如果我使用典型的对齐参数,那么如果参数的长度小于提供的对齐值,就会进行填充。例如:

string format = "#{0,10}#";
string argument;
string output;
argument = Console.ReadLine();
output = String.Format(format, argument);
String.WriteLine(output);

如果我输入"try"作为一个值,我得到的结果是:

#try        #

如果我输入"trytrytrytry",我得到:

#trytrytrytry#

我希望发生的事情如下所示:输入"我想要:

#          #

但是输入"try"我想要:

#try#

我要写的代码应该尽可能通用,因为format参数不是静态的,是在运行时定义的。

这样做的最佳实践是定义一个自定义字符串格式化程序。不幸的是,自定义代码似乎只能作用于String.Format()方法的格式参数的"format"部分。

事实上,如果我定义一个自定义格式化程序:

public class EmptyFormatter : IFormatProvider, ICustomFormatter
{
     public object GetFormat(Type formatType)
     {
         if (formatType == typeof(ICustomFormatter))
             return this;
         else
             return null;
     }
     public string Format(string format, object arg, IFormatProvider formatProvider)
     {
         if (!this.Equals(formatProvider))
             return null;
         if (string.IsNullOrEmpty(format))
             throw new ArgumentNullException();
         return numericString;
     }
 }

Format方法的formatarg参数不包含对齐参数,那么我实际上无法检查应该应用的填充值的长度,因此我无法正确操作。此外,字符串的这部分"格式化"似乎应用于其他地方,但我不知道在哪里。

有办法"改变"这种行为吗

C#自定义字符串对齐方式

格式项具有以下语法:

index[,alignment][ :formatString] }

format参数为null的原因是没有formatString组件,只有对齐。我找不到从Format方法访问对齐组件的方法。然而,一个(丑陋的)解决方案是将formatString设置为与对齐相同,这样您就可以使用format参数访问它:

#{0,10:10}#

一个不那么难看的解决方案是创建自己的方法扩展,它首先从给定的格式中提取对齐,然后调用传统的String.format方法。

例如:

    public static string StringFormat(this string Arg, string Format) {
        //extract alignment from string
        Regex reg = new Regex(@"{[-+]?'d+',[-+]?('d+)(?::[-+]?'d+)?}");
        Match m = reg.Match(Format);
        if (m != null) { //check if alignment exists
            int allignment = int.Parse(m.Groups[1].Value); //get alignment
            Arg = Arg.PadLeft(allignment); //pad left, you can make the length check here
            Format = Format.Remove(m.Groups[1].Index - 1, m.Groups[1].Length + 1); //remove alignment from format
        }

        return (string.Format(Format, Arg));
    }

使用代码:

string format = "#{0,10}#";
string argument = "try";
string output = argument.StringFormat(format); //"#       try#"