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
方法的format
和arg
参数不包含对齐参数,那么我实际上无法检查应该应用的填充值的长度,因此我无法正确操作。此外,字符串的这部分"格式化"似乎应用于其他地方,但我不知道在哪里。
有办法"改变"这种行为吗
格式项具有以下语法:
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#"