我有下面的说明性代码。我需要条件1的输出右对齐并用零填充,如| 1234500000 |而不是| 0000012345 |而不是固定宽度为10.格式字符串是条件的意思,根据某些条件,可能有许多可能的格式字符串之一,而输出只有一行。因此,PadRight和PadLeft等函数不能与值一起使用,除非有一种方法可以使用它们,同时仍然具有相同的输出行。 (.NET 4.5)
我怎样才能获得| 1234500000 |在满足这些要求的同时?
string format;
if (condition1)
format = "|{0:0000000000}|";
else
if (condition2)
format = "|{0}|";
//more conditions here
Int64 value = 12345;
string a = String.Format(format, value);
a.Dump();
答案 0 :(得分:3)
只有很多内置和可自定义的字符串格式。也许你可以为每个条件设置不同的格式化函数,然后再调用它:
Func<Int64, String> formatter;
if (condition1)
{
formatter = (number) => number.ToString().PadRight(10, '0');
}
else if (condition2)
{
formatter = (number) => number.ToString();
}
Int64 sample = 12345;
string output = string.Format("|{0}|", formatter(sample));
output.Dump();
另一种选择是通过实施IFormatProvider
和ICustomFormatter
来创建自己的自定义字符串格式提供程序。例如,这是一个草率的,可以做正确的填充:
public class RightPaddedStringFormatter : IFormatProvider, ICustomFormatter
{
private int _width;
public RightPaddedStringFormatter(int width)
{
if (width < 0)
throw new ArgumentOutOfRangeException("width");
_width = width;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
// format doubles to 3 decimal places
return arg.ToString().PadRight(_width, '0');
}
public object GetFormat(Type formatType)
{
return (formatType == typeof(ICustomFormatter)) ? this : null;
}
}
然后你可以使用你的条件来选择格式化程序,例如:
IFormatProvider provider;
if (condition1)
{
provider = new RightPaddedStringFormatter(10);
}
...
Int64 sample = 12345;
string output = string.Format(provider, "|{0}|", sample);
output.Dump();
答案 1 :(得分:0)
我从上面的Possible Duplicate进行了复制,看起来与Cory的答案类似。这允许你使用任何字符的字符串.Format和pad,无论它是0还是X,它都留给格式化程序。
用LinqPad撰写。
void Main()
{
var val = 12345;
string.Format(new PaddedStringFormatInfo(), "{0:20:0}", val).Dump();
string.Format(new PaddedStringFormatInfo(), "{0:-20:0}", val).Dump();
}
public sealed class PaddedStringFormatInfo : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (typeof(ICustomFormatter).Equals(formatType)) return this;
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null) throw new ArgumentNullException("Argument cannot be null");
if (format == null) return arg.ToString();
string[] args = format.Split(':');
if (args.Length == 1) String.Format("{0, " + format + "}", arg);
int padLength = 0;
if (!int.TryParse(args[0], out padLength)) throw new ArgumentException("Padding length should be an integer");
switch (args.Length)
{
case 2: // padded format
if (padLength > 0) return (arg.ToString()).PadLeft(padLength, args[1][0]);
return (arg.ToString()).PadRight(padLength * -1, args[1][0]);
default: // use default string.format
return string.Format("{0," + format + "}", arg);
}
}
}
输出结果为:
00000000000000012345
12345000000000000000