ICustomFormatter, который работает с uint.ToString

Можно ли создать файл, который работает с uint?

У меня есть следующий FormatProvider

          internal class IPFormatProvider : IFormatProvider, ICustomFormatter
    {
        public object? GetFormat(Type? formatType)
        {
            if (formatType == typeof(ICustomFormatter))
            {
                return this;
            }
            return null;
        }

        public string Format(string? format, object? arg, IFormatProvider? formatProvider)
        {
            if (arg is uint ipAddress)
            {
                if (string.IsNullOrEmpty(format))
                {
                    return ipAddress.ToString(); // Fallback to default ToString()
                }

                switch (format.ToUpperInvariant())
                {
                    case "D":
                        byte[] bytes = BitConverter.GetBytes(ipAddress);
                        Array.Reverse(bytes); // Reverse the byte order to handle little-endian systems
                        return string.Join(".", bytes);
                    case "H":
                        return ipAddress.ToString("X8");
                    default:
                        return ipAddress.ToString(format, formatProvider);
                }
            }

            return arg?.ToString(); // Fallback to default ToString()
        }
    }

Следующее:

      uint ipAddress = 3232235776; // Example IP address value (192.168.1.0 in dot notation)

Console.WriteLine(String.Format(new IPFormatProvider(),"{0:D}",ipAddress)); // Output: 192.168.1.0
Console.WriteLine(ipAddress.ToString("D", new IPFormatProvider()));         // Output: 192.168.1.0

Результаты:

      192.168.0.1
3232235776

Запускаем его через отладчикGetFormat()этот вариант даже не называется.

Это все равно, что отказываться использовать the, когдаformat=="D".

Также при выборе другой буквы, напримерformat=="Y"тотToString()вариант выдает исключение:

      System.FormatException
  HResult=0x80131537
  Message=Format specifier was invalid.
  Source=System.Private.CoreLib
  StackTrace:
   at System.Number.NumberToString(ValueStringBuilder& sb, NumberBuffer& number, Char format, Int32 nMaxDigits, NumberFormatInfo info)
   at System.Number.<FormatUInt32>g__FormatUInt32Slow|42_0(UInt32 value, String format, IFormatProvider provider)
   at System.UInt32.ToString(String format, IFormatProvider provider)
   at Program.<Main>$(String[] args) in 

Кажется, это потому, что

      formatType != typeof(ICustomFormatter)

вместо этого, посмотрев в отладчике,formatTypeэтоNumberFormatInfo()

Можно ли использоватьICustomFormatterдляUInt32.ToString()?

0 ответов

Другие вопросы по тегам