Introduction
Many people including Grant Frisken in this article have shown of ways to localise and make an enum
readable. These are great articles. However there are many times when you are in a hurry and have not got the time to "readabalize" the text but still want to display the enum
values in the code. Another point is that many enum
s that we use are not owned by us, and therefore we cannot use his methods.
I recently made a whole framework for my company and I used enum
s as the keys for all lookups, etc. I also used enum
s for error codes like NoReply
... The advantage of enum
s is that you can be sure that the text only occurs once and at the same time you only need to enter the text once.
(You could do it like this)...
const string NoReply = "No Reply"
... but that means entering the same text twice.
Also if you change your mind and decide that "Long Wait For Reply" would be better, you risk having the customer see something different than you...
Using the Code
To use convert the enum
values to text, use the following:
enum Example
{
RedAndBlue,
BlueAndGreen,
AnotherColour,
Whatever,
SomethingElse,
UseYourImagination,
}
string redAndBlue = EnumConverter.AutoSpace(Example.RedAndBlue);
Example example = (Example)
Enum.Parse(typeof(Example), EnumConverter.RemoveSpaces(redAndBlue));
You can convert the whole enum
like this:
string[] example = EnumConverter.AutoSpace(typeof(Example));
That's it. I know it's not a huge step for mankind, but it can help to make a big difference quickly. Especially if you are under time pressure...
The disadvantage with this solution is that you cannot have words starting with small letters. However, you still can use the ideas of Grant Frisken to make things better once it is working.
This example also works for string
s so you can even make class names readable...
The main part of this code is here: The text is split by searching for capital letters or numbers...
static public string AutoSpace(string sInput)
{
StringBuilder sOut = new StringBuilder();
for (int i = 0; i < sInput.Length; i++)
{
char c = sInput[i];
if (c >= 'A' && c <= 'Z')
{
if (i > 0 && (sInput[i - 1] >= 'A'
&& sInput[i - 1] <= 'Z'))
sOut.Append(c);
else if (i == 0)
sOut.Append(c);
else
sOut.Append(" " + c);
}
else if (c == '_')
sOut.Append('_');
else if (c >= '0' && c <= '9')
{
if (i > 0 && (sInput[i - 1] >= 'a'
&& sInput[i - 1] <= 'z'))
sOut.Append(" " + c);
else
sOut.Append(c);
}
else
sOut.Append(c);
}
return sOut.ToString();
}
A possible modification could include a list of small words (like if, or, etc.) that would always be written in small letters.
Please let me know if this was useful.