public void PrintFormatted(string text, params object[] args) { if (text == null) { throw new ArgumentNullException(nameof(text)); } int currentArgument = 0; int currentCharacter = 0; while (currentCharacter < text.Length) { char c = text[currentCharacter]; if (c != '%') { this.DisplayCharacter(c); } else { currentCharacter++; c = text[currentCharacter]; switch (c) { case 's': { // string string arg = (string)args[currentArgument]; currentArgument++; this.DisplayString(arg); break; } case 'd': { // decimal short arg = short.Parse(args[currentArgument].ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture); currentArgument++; if (arg < 0) { this.DisplayCharacter('-'); this.DisplayString(StringUtility.NumberToString(arg * -1)); } else { this.DisplayString(StringUtility.NumberToString(arg)); } break; } case 'u': { // unsigned decimal ushort arg = ushort.Parse(args[currentArgument].ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture); currentArgument++; this.DisplayString(StringUtility.NumberToString(arg)); break; } case 'x': { // hex number ushort arg = ushort.Parse(args[currentArgument].ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture); currentArgument++; this.DisplayString(StringUtility.NumberToHexString(arg)); break; } case 'c': { // character char arg = '\0'; string s = args[currentArgument].ToString(); if (s.Length > 0) { arg = s[0]; } currentArgument++; this.DisplayCharacter(arg); break; } default: { // not recognised this.DisplayCharacter('%'); currentCharacter--; break; } } } currentCharacter++; } this.UpdateTextRegion(); }