/// <summary> /// <para> /// Utilizing lazy loading, inInitializes and returns <see cref="CharacterCasingChecks"/> containing a default set of <see cref="CharacterCasingCheck"/> objects; these objects are utilized when a CharacterCasingFormatting rule is applied to a property. /// </para> /// <para> /// If the <see cref="CharacterCasingChecks.SetGetChecksSource"/> method has been called, this method will invoke the source argument each time this method is called. /// </para> /// </summary> /// <returns>Returns <see cref="CharacterCasingChecks"/> containing a default set of <see cref="CharacterCasingCheck"/> objects.</returns> /// <remarks> /// <para> /// Developers you can use the returned value from this methods and add or remove checks. For example, you could load checks from a database, config file, web service, etc. /// </para> /// <para> /// Developers you can also use the <see cref="CharacterCasingChecks.SetGetChecksSource"/> method to create an empty <see cref="CharacterCasingChecks"/> object and then populate it within your application. Note: this technique does not load up any default checks./> /// </para> /// </remarks> public static CharacterCasingChecks GetChecks() { if (_getChecksSource != null) { return(_getChecksSource.Invoke()); } if (_instance == null) { // ReSharper disable UseObjectOrCollectionInitializer _instance = new CharacterCasingChecks(); // ReSharper restore UseObjectOrCollectionInitializer //TODO: Optionally load this from a data base, config file, web service, etc. // //You can also add, remove or edit these by modifying the CharacterCasingChecks collection from your application. // //These are values that are specific to your company or line of business //remove the ones that don't apply and add your own. //ensure that the lengths of the LookFor and the ReplaceWith strings are the same _instance.Add(new CharacterCasingCheck("Po Box", "PO Box")); _instance.Add(new CharacterCasingCheck("C/o ", "c/o ")); _instance.Add(new CharacterCasingCheck("C/O ", "c/o ")); _instance.Add(new CharacterCasingCheck("Vpn ", "VPN ")); _instance.Add(new CharacterCasingCheck("Xp ", "XP ")); _instance.Add(new CharacterCasingCheck(" Or ", " or ")); _instance.Add(new CharacterCasingCheck(" And ", " and ")); _instance.Add(new CharacterCasingCheck(" Nw ", " NW ")); _instance.Add(new CharacterCasingCheck(" Ne ", " NE ")); _instance.Add(new CharacterCasingCheck(" Sw ", " SW ")); _instance.Add(new CharacterCasingCheck(" Se ", " SE ")); _instance.Add(new CharacterCasingCheck(" Llc. ", " LLC. ")); _instance.Add(new CharacterCasingCheck(" Llc ", " LLC ")); _instance.Add(new CharacterCasingCheck(" Lc ", " LC ")); _instance.Add(new CharacterCasingCheck(" Lc. ", " LC. ")); _instance.Add(new CharacterCasingCheck("Wpf", "WPF")); } return(_instance); }
/// <summary> /// Corrects the text character casing and optionally format phone fields similar to Microsoft Outlook. /// </summary> /// <param name="inputString">String to be case corrected and optionally formatted.</param> /// <param name="characterCase">Character case and format.</param> /// <returns>String case corrected and optionally formatted.</returns> /// <exception cref="InvalidEnumArgumentException">characterCase is not a member of CharacterCase enum.</exception> public static String ApplyCharacterCasing(String inputString, CharacterCasing characterCase) { if (!Enum.IsDefined(typeof(CharacterCasing), characterCase)) { throw new InvalidEnumArgumentException(nameof(characterCase), (Int32)characterCase, typeof(CharacterCasing)); } inputString = inputString.Trim(); if (inputString.Length == 0) { return(inputString); } Int32 intX; switch (characterCase) { case CharacterCasing.None: return(inputString); case CharacterCasing.LowerCase: return(inputString.ToLower()); case CharacterCasing.UpperCase: return(inputString.ToUpper()); case CharacterCasing.OutlookPhoneNoProperName: return(FormatOutLookPhone(inputString)); case CharacterCasing.OutlookPhoneUpper: return(FormatOutLookPhone(inputString).ToUpper()); } inputString = inputString.ToLower(); String previous = " "; String previousTwo = " "; String previousThree = " "; String charString; for (intX = 0; intX < inputString.Length; intX++) { charString = inputString.Substring(intX, 1); if (Char.IsLetter(Convert.ToChar(charString)) && charString != charString.ToUpper()) { if (previous == " " || previous == "." || previous == "-" || previous == "/" || previousThree == " O'" || previousTwo == "Mc") { inputString = inputString.Remove(intX, 1); inputString = inputString.Insert(intX, charString.ToUpper()); previous = charString.ToUpper(); } else { previous = charString; } } else { previous = charString; } previousTwo = previousTwo.Substring(1, 1) + previous; previousThree = previousThree.Substring(1, 1) + previousThree.Substring(2, 1) + previous; } intX = inputString.IndexOf("'", StringComparison.Ordinal); if (intX == 1) { String insertString = inputString.Substring(2, 1).ToUpper(); inputString = inputString.Remove(2, 1); inputString = inputString.Insert(2, insertString); } try { intX = inputString.IndexOf("'", 3, StringComparison.Ordinal); if (intX > 3 && inputString.Substring(intX - 2, 1) == " ") { String insertString = inputString.Substring(intX + 1, 1).ToUpper(); inputString = inputString.Remove(intX + 1, 1); inputString = inputString.Insert(intX + 1, insertString); } // ReSharper disable EmptyGeneralCatchClause } catch { // ReSharper restore EmptyGeneralCatchClause } //never remove this code inputString += " "; foreach (CharacterCasingCheck check in CharacterCasingChecks.GetChecks()) { if (inputString.Contains(check.LookFor)) { Int32 foundIndex = inputString.IndexOf(check.LookFor, StringComparison.Ordinal); if (foundIndex > -1) { inputString = inputString.Remove(foundIndex, check.LookFor.Length); inputString = inputString.Insert(foundIndex, check.ReplaceWith); } } } if (characterCase == CharacterCasing.OutlookPhoneProperName) { inputString = FormatOutLookPhone(inputString); } return(inputString.Trim()); }