。NET String.Format包括减号0的减号在内

问题描述 投票:0回答:1

我正在移植一些使用_vsnwprintf_s将C转换为11个字符串的C ++代码。如果数字为负数,则仍返回11个字符串。

我需要在C#中复制此行为。如果我使用:

String.Format("{0:D11}",-30800322);
String.Format("{0:D11}",30800322);

问题是负数导致输出12个字符,而不是11个字符。即,它输出-00030800322,但我希望它输出-0030800322,而30800322应该输出00030800322。

我可以通过检查数字是否为负数并使用{0:D10}表示负数,并使用{0:D11}表示正数来解决它,但是我想知道是否有更好的方法来更紧密地复制C ++版本,其中包括减去符号。

.net string.format
1个回答
2
投票

您有多种方法获得该输出。因此,对于正值和负值,您有两个变量:

var s = -30800322;
var u = 30800322;

1。字符串。替换


快速简便的方法:

Console.WriteLine(string.Format("{0:D11}", s).Replace("-0", "-"));
Console.WriteLine(string.Format("{0:D11}", u).Replace("-0", "-"));

2。 IFormatProvider


创建自定义IFormatProvider以将其与string.Format(..)功能一起使用:

public class vsnwprintf : IFormatProvider, ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg == null || !int.TryParse(arg.ToString(), out int x))
            return null;

        var f = "{0:D11}";

        if (x < 0)
            return string.Concat("-", string.Format(f, x).Substring(2));
        else
            return string.Format(f, x);
    }

    public object GetFormat(Type formatType)
    {
        return (formatType == typeof(ICustomFormatter)) ? this : null;
    }
}

用法:

Console.WriteLine(string.Format(new vsnwprintf(), "{0}", s));
Console.WriteLine(string.Format(new vsnwprintf(), "{0}", u));

3。 ToString()


创建一个新类并覆盖ToString()函数:

public class vsnwprintf
{
    private readonly int Value;
    private readonly int Length;

    private vsnwprintf() { }

    public vsnwprintf(int val, int length) : this()
    {
        Value = val;
        Length = length;
    }

    public override string ToString()
    {
        var f = string.Concat("{0:D", Length, "}");

        if (Value < 0)
            return string.Concat("-", string.Format(f, Value).Substring(2));
        else
            return string.Format(f, Value);
    }
}

用法:

Console.WriteLine(new vsnwprintf(s, 11));
Console.WriteLine(new vsnwprintf(u, 11));

4。扩展方法


创建静态类并为int类型创建扩展方法:

public static class Extensions
{
    public static string Tovsnwprintf(this int Value, int Length = 11)
    {
        var f = string.Concat("{0:D", Length, "}");

        if (Value < 0)
            return string.Concat("-", string.Format(f, Value).Substring(2));
        else
            return string.Format(f, Value);
    }
}

用法:

Console.WriteLine(s.Tovsnwprintf());
Console.WriteLine(u.Tovsnwprintf(11));

每个返回:

-0030800322
00030800322
© www.soinside.com 2019 - 2024. All rights reserved.