using System; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using Volo.ExtensionMethods.Collections.Generic; namespace Volo.ExtensionMethods { //TODO: Not working properly with cultures! /// /// Extension methods for String class. /// public static class StringExtensions { /// /// Adds a char to end of given string if it does not ends with the char. /// public static string EnsureEndsWith(this string str, char c) { return EnsureEndsWith(str, c, StringComparison.Ordinal); } /// /// Adds a char to end of given string if it does not ends with the char. /// public static string EnsureEndsWith(this string str, char c, StringComparison comparisonType) { Check.NotNull(str, nameof(str)); if (str.EndsWith(c.ToString(), comparisonType)) { return str; } return str + c; } /// /// Adds a char to beginning of given string if it does not starts with the char. /// public static string EnsureStartsWith(this string str, char c) { return EnsureStartsWith(str, c, StringComparison.Ordinal); } /// /// Adds a char to beginning of given string if it does not starts with the char. /// public static string EnsureStartsWith(this string str, char c, StringComparison comparisonType) { Check.NotNull(str, nameof(str)); if (str.StartsWith(c.ToString(), comparisonType)) { return str; } return c + str; } /// /// Indicates whether this string is null or an System.String.Empty string. /// public static bool IsNullOrEmpty(this string str) { return string.IsNullOrEmpty(str); } /// /// indicates whether this string is null, empty, or consists only of white-space characters. /// public static bool IsNullOrWhiteSpace(this string str) { return string.IsNullOrWhiteSpace(str); } /// /// Gets a substring of a string from beginning of the string. /// /// Thrown if is null /// Thrown if is bigger that string's length public static string Left(this string str, int len) { Check.NotNull(str, nameof(str)); if (str.Length < len) { throw new ArgumentException("len argument can not be bigger than given string's length!"); } return str.Substring(0, len); } /// /// Converts line endings in the string to . /// public static string NormalizeLineEndings(this string str) { return str.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", Environment.NewLine); } /// /// Gets index of nth occurence of a char in a string. /// /// source string to be searched /// Char to search in /// Count of the occurence public static int NthIndexOf(this string str, char c, int n) { Check.NotNull(str, nameof(str)); var count = 0; for (var i = 0; i < str.Length; i++) { if (str[i] != c) { continue; } if ((++count) == n) { return i; } } return -1; } /// /// Removes first occurrence of the given postfixes from end of the given string. /// /// The string. /// one or more postfix. /// Modified string or the same string if it has not any of given postfixes public static string RemovePostFix(this string str, params string[] postFixes) { if (str.IsNullOrEmpty()) { return null; } if (postFixes.IsNullOrEmpty()) { return str; } foreach (var postFix in postFixes) { if (str.EndsWith(postFix)) { return str.Left(str.Length - postFix.Length); } } return str; } /// /// Removes first occurrence of the given prefixes from beginning of the given string. /// /// The string. /// one or more prefix. /// Modified string or the same string if it has not any of given prefixes public static string RemovePreFix(this string str, params string[] preFixes) { if (str.IsNullOrEmpty()) { return null; } if (preFixes.IsNullOrEmpty()) { return str; } foreach (var preFix in preFixes) { if (str.StartsWith(preFix)) { return str.Right(str.Length - preFix.Length); } } return str; } /// /// Gets a substring of a string from end of the string. /// /// Thrown if is null /// Thrown if is bigger that string's length public static string Right(this string str, int len) { Check.NotNull(str, nameof(str)); if (str.Length < len) { throw new ArgumentException("len argument can not be bigger than given string's length!"); } return str.Substring(str.Length - len, len); } /// /// Uses string.Split method to split given string by given separator. /// public static string[] Split(this string str, string separator) { return str.Split(new[] { separator }, StringSplitOptions.None); } /// /// Uses string.Split method to split given string by given separator. /// public static string[] Split(this string str, string separator, StringSplitOptions options) { return str.Split(new[] { separator }, options); } /// /// Uses string.Split method to split given string by . /// public static string[] SplitToLines(this string str) { return str.Split(Environment.NewLine); } /// /// Uses string.Split method to split given string by . /// public static string[] SplitToLines(this string str, StringSplitOptions options) { return str.Split(Environment.NewLine, options); } /// /// Converts PascalCase string to camelCase string. /// /// String to convert /// camelCase of the string public static string ToCamelCase(this string str) { if (string.IsNullOrWhiteSpace(str)) { return str; } if (str.Length == 1) { return str.ToLower(); } return char.ToLower(str[0]) + str.Substring(1); } /// /// Converts given PascalCase/camelCase string to sentence (by splitting words by space). /// Example: "ThisIsSampleSentence" is converted to "This is a sample sentence". /// /// String to convert. public static string ToSentenceCase(this string str) { if (string.IsNullOrWhiteSpace(str)) { return str; } return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1])); } /// /// Converts string to enum value. /// /// Type of enum /// String value to convert /// Returns enum object public static T ToEnum(this string value) where T : struct { Check.NotNull(value, nameof(value)); return (T)Enum.Parse(typeof(T), value); } /// /// Converts string to enum value. /// /// Type of enum /// String value to convert /// Ignore case /// Returns enum object public static T ToEnum(this string value, bool ignoreCase) where T : struct { Check.NotNull(value, nameof(value)); return (T)Enum.Parse(typeof(T), value, ignoreCase); } public static string ToMd5(this string str) { using (var md5 = MD5.Create()) { var inputBytes = Encoding.UTF8.GetBytes(str); var hashBytes = md5.ComputeHash(inputBytes); var sb = new StringBuilder(); foreach (var hashByte in hashBytes) { sb.Append(hashByte.ToString("X2")); } return sb.ToString(); } } /// /// Converts camelCase string to PascalCase string. /// /// String to convert /// PascalCase of the string public static string ToPascalCase(this string str) { if (string.IsNullOrWhiteSpace(str)) { return str; } if (str.Length == 1) { return str.ToUpper(); } return char.ToUpper(str[0]) + str.Substring(1); } /// /// Gets a substring of a string from beginning of the string if it exceeds maximum length. /// /// Thrown if is null public static string Truncate(this string str, int maxLength) { if (str == null) { return null; } if (str.Length <= maxLength) { return str; } return str.Left(maxLength); } /// /// Gets a substring of a string from beginning of the string if it exceeds maximum length. /// It adds a "..." postfix to end of the string if it's truncated. /// Returning string can not be longer than maxLength. /// /// Thrown if is null public static string TruncateWithPostfix(this string str, int maxLength) { return TruncateWithPostfix(str, maxLength, "..."); } /// /// Gets a substring of a string from beginning of the string if it exceeds maximum length. /// It adds given to end of the string if it's truncated. /// Returning string can not be longer than maxLength. /// /// Thrown if is null public static string TruncateWithPostfix(this string str, int maxLength, string postfix) { if (str == null) { return null; } if (str == string.Empty || maxLength == 0) { return string.Empty; } if (str.Length <= maxLength) { return str; } if (maxLength <= postfix.Length) { return postfix.Left(maxLength); } return str.Left(maxLength - postfix.Length) + postfix; } } }