public string Format(string format, object arg, IFormatProvider formatProvider) { if (arg == null) { return(string.Empty); } if (arg is Keyword kw) { arg = kw.KeywordValue; } var provider = BaseProvider ?? CultureInfo.CurrentCulture; if (format == "X") { return(string.Format(provider, "0x{0:X}", arg)); } if (format == "Xs") { return(string.Format(provider, "{0:X}", arg)); } if (format == "PX") { switch (arg) { case byte x: return("0x" + x.ToString("X2", provider)); case sbyte x: return("0x" + x.ToString("X2", provider)); case ushort x: return("0x" + x.ToString("X4", provider)); case short x: return("0x" + x.ToString("X4", provider)); case uint x: return("0x" + x.ToString("X8", provider)); case int x: return("0x" + x.ToString("X8", provider)); case ulong x: return("0x" + x.ToString("X16", provider)); case long x: return("0x" + x.ToString("X16", provider)); case decimal x: return(x.ToString("N0", provider)); case double x: var clamped = DoubleUtils.ClampToUInt64(x); return("0x" + clamped.ToString("X16", provider)); } return(string.Format(provider, "0x{0:X}", arg)); } if (format == "PXs") { switch (arg) { case byte x: return(x.ToString("X2", provider)); case sbyte x: return(x.ToString("X2", provider)); case ushort x: return(x.ToString("X4", provider)); case short x: return(x.ToString("X4", provider)); case uint x: return(x.ToString("X8", provider)); case int x: return(x.ToString("X8", provider)); case ulong x: return(x.ToString("X16", provider)); case long x: return(x.ToString("X16", provider)); case decimal x: return(x.ToString("N0", provider)); case double x: var clamped = DoubleUtils.ClampToUInt64(x); return(clamped.ToString("X16", provider)); } return(string.Format(provider, "{0:X}", arg)); } if (format == "D0") { return(string.Format(provider, "{0:D0}", arg)); } if (format == "N0") { return(string.Format(provider, "{0:N0}", arg)); } if (format == "F0") { return(string.Format(provider, "{0:F0}", arg)); } if (arg is IFormattable f) { return(f.ToString(format, provider)); } return(arg.ToString()); }