C# 在使用动态格式时,如何使用string.format将零向右填充?
我有下面的说明性代码。我需要条件1的输出是右对齐的,并用零填充,例如1244500000 |而不是| 00000 12345 |而不是,并且固定宽度为10。格式字符串是有条件的,这意味着根据某些条件可以有许多可能的格式字符串中的一个,而输出只有一行。因此,像PadRight和PadLeft这样的函数不能与值一起使用,除非在仍然具有相同输出线的情况下有办法使用它们。(.NET 4.5) 如何在满足这些要求的同时获得1234500000英镑C# 在使用动态格式时,如何使用string.format将零向右填充?,c#,.net,string.format,C#,.net,String.format,我有下面的说明性代码。我需要条件1的输出是右对齐的,并用零填充,例如1244500000 |而不是| 00000 12345 |而不是,并且固定宽度为10。格式字符串是有条件的,这意味着根据某些条件可以有许多可能的格式字符串中的一个,而输出只有一行。因此,像PadRight和PadLeft这样的函数不能与值一起使用,除非在仍然具有相同输出线的情况下有办法使用它们。(.NET 4.5) 如何在满足这些要求的同时获得1234500000英镑 string format; if (condition
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();
只有这么多内置的和可自定义的字符串格式。也许您可以为每个条件设置不同的格式化函数,然后在以后调用它:
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 provider;
if (condition1)
{
provider = new RightPaddedStringFormatter(10);
}
...
Int64 sample = 12345;
string output = string.Format(provider, "|{0}|", sample);
output.Dump();
我从上面抄袭的,看起来和科里的答案很相似。这允许您使用字符串。格式化并在任一侧填充任何字符,无论是0还是X,都由格式化程序处理
用……写的
其结果是:
00000000000000012345
12345000000000000000
当您用零填充最后一组数字时,您如何确切地知道它们中是否有一个应该为0?对我来说似乎是个坏主意。你什么意思?零是左对齐的,因此数字从第一个非零数字开始。数字不是以零开头的。可能是@Tony_Henrich的重复:如果你真的想用零填充数字,而不是其他数字,那么你的代码工作得非常好。还有哪些其他格式使您的代码无法使用?@Cᴏʀ这是对某人编辑的一次编辑,这就颠覆了问题。它被还原了。
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