Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用动态格式时,如何使用string.format将零向右填充?_C#_.net_String.format - Fatal编程技术网

C# 在使用动态格式时,如何使用string.format将零向右填充?

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

我有下面的说明性代码。我需要条件1的输出是右对齐的,并用零填充,例如1244500000 |而不是| 00000 12345 |而不是,并且固定宽度为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();

只有这么多内置的和可自定义的字符串格式。也许您可以为每个条件设置不同的格式化函数,然后在以后调用它:

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