diff --git a/ICD.Common.Utils.Tests/EnumUtilsTest.cs b/ICD.Common.Utils.Tests/EnumUtilsTest.cs index 6466262..44daa69 100644 --- a/ICD.Common.Utils.Tests/EnumUtilsTest.cs +++ b/ICD.Common.Utils.Tests/EnumUtilsTest.cs @@ -290,5 +290,17 @@ namespace ICD.Common.Utils.Tests } #endregion + + #region Formatting + + [TestCase(eTestFlagsEnum.A | eTestFlagsEnum.B | eTestFlagsEnum.C | (eTestFlagsEnum)8, + "A, B, C, 8")] + public void ToStringUndefinedTest(eTestFlagsEnum value, string expected) + { + string toString = EnumUtils.ToStringUndefined(value); + Assert.AreEqual(expected, toString); + } + + #endregion } } diff --git a/ICD.Common.Utils/EnumUtils.cs b/ICD.Common.Utils/EnumUtils.cs index d8289fe..df98ed5 100644 --- a/ICD.Common.Utils/EnumUtils.cs +++ b/ICD.Common.Utils/EnumUtils.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using ICD.Common.Properties; using ICD.Common.Utils.Extensions; #if SIMPLSHARP @@ -756,5 +757,39 @@ namespace ICD.Common.Utils } #endregion + + #region Formatting + + /// + /// Builds a comma delimited string of the defined enum flags, followed by the numeric remainder. + /// + /// + /// + /// + public static string ToStringUndefined(T value) + where T : struct, IConvertible + { + if (!IsFlagsEnum()) + return value.ToString(); + + long remainder = (int)(object)value; + + StringBuilder output = new StringBuilder(); + string format = "{0}"; + + foreach (T flag in GetFlagsExceptNone(value)) + { + output.AppendFormat(format, flag); + remainder -= (int)(object)flag; + format = ", {0}"; + } + + if (remainder != 0) + output.AppendFormat(", {0}", remainder); + + return output.ToString(); + } + + #endregion } } diff --git a/ICD.Common.Utils/Extensions/EnumExtensions.cs b/ICD.Common.Utils/Extensions/EnumExtensions.cs index 121321b..559bb7c 100644 --- a/ICD.Common.Utils/Extensions/EnumExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumExtensions.cs @@ -60,7 +60,7 @@ namespace ICD.Common.Utils.Extensions } /// - /// Returns the enum value as a + /// Returns the enum value as a ushort. /// /// /// @@ -71,5 +71,17 @@ namespace ICD.Common.Utils.Extensions { return (ushort)(object)extends; } + + /// + /// Builds a comma delimited string of the defined enum flags, followed by the numeric remainder. + /// + /// + /// + /// + public static string ToStringUndefined(this T extends) + where T : struct, IConvertible + { + return EnumUtils.ToStringUndefined(extends); + } } }