.NET String.Format 为填充 0 包含负号登录计数
.NET String.Format Include Minus Sign in Count for Padding 0
我正在移植一些使用 _vsnwprintf_s 将数字转换为 11 个字符串的 C++ 代码。如果数字为负数,它仍然是 returns 11 个字符串。
我需要在 C# 中复制此行为。如果我使用:
String.Format("{0:D11}",-30800322);
String.Format("{0:D11}",30800322);
问题是负数导致 12 个字符输出,而不是 11。即它输出 -00030800322 但我希望它输出 -0030800322 而 30800322 应该输出 00030800322。
我可以通过检查数字是否为负数并使用 {0:D10}
表示负数和 {0:D11}
表示正数来解决它,但是我想知道是否有更好的方法来更紧密地复制计数中包含减号的 C++ 版本。
您可以通过多种方式获得该输出。所以你有两个变量用于正值和负值:
var s = -30800322;
var u = 30800322;
1. string.Replace
快速简单的方法:
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()
创建一个新的 class 并覆盖 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. Extension Method
创建静态 class 并为 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));
每个 returns:
-0030800322
00030800322
我正在移植一些使用 _vsnwprintf_s 将数字转换为 11 个字符串的 C++ 代码。如果数字为负数,它仍然是 returns 11 个字符串。
我需要在 C# 中复制此行为。如果我使用:
String.Format("{0:D11}",-30800322);
String.Format("{0:D11}",30800322);
问题是负数导致 12 个字符输出,而不是 11。即它输出 -00030800322 但我希望它输出 -0030800322 而 30800322 应该输出 00030800322。
我可以通过检查数字是否为负数并使用 {0:D10}
表示负数和 {0:D11}
表示正数来解决它,但是我想知道是否有更好的方法来更紧密地复制计数中包含减号的 C++ 版本。
您可以通过多种方式获得该输出。所以你有两个变量用于正值和负值:
var s = -30800322;
var u = 30800322;
1. string.Replace
快速简单的方法:
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()
创建一个新的 class 并覆盖 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. Extension Method
创建静态 class 并为 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));
每个 returns:
-0030800322
00030800322