using System.Text; namespace PaySharp.Core.Utils { public enum StringCase { /// /// 蛇形策略 /// Snake, /// /// 骆驼策略 /// Camel, /// /// 小写策略 /// Lower, /// /// 不执行策略 /// None } internal enum SnakeCaseState { Start, Lower, Upper, NewWord } public static class StringUtil { /// /// 将字符串转换为蛇形策略 /// /// 字符串 /// public static string ToSnakeCase(this string s) { if (string.IsNullOrEmpty(s)) { return s; } var sb = new StringBuilder(); var state = SnakeCaseState.Start; for (var i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (state != SnakeCaseState.Start) { state = SnakeCaseState.NewWord; } } else if (char.IsUpper(s[i])) { switch (state) { case SnakeCaseState.Upper: var hasNext = i + 1 < s.Length; if (i > 0 && hasNext) { var nextChar = s[i + 1]; if (!char.IsUpper(nextChar) && nextChar != '_') { sb.Append('_'); } } break; case SnakeCaseState.Lower: case SnakeCaseState.NewWord: sb.Append('_'); break; } sb.Append(char.ToLowerInvariant(s[i])); state = SnakeCaseState.Upper; } else if (s[i] == '_') { sb.Append('_'); state = SnakeCaseState.Start; } else { if (state == SnakeCaseState.NewWord) { sb.Append('_'); } sb.Append(s[i]); state = SnakeCaseState.Lower; } } return sb.ToString(); } /// /// 将字符串转换为骆驼策略 /// /// 字符串 /// public static string ToCamelCase(this string s) { if (string.IsNullOrEmpty(s) || !char.IsUpper(s[0])) { return s; } var chars = s.ToCharArray(); for (var i = 0; i < chars.Length; i++) { if (i == 1 && !char.IsUpper(chars[i])) { break; } var hasNext = i + 1 < chars.Length; if (i > 0 && hasNext && !char.IsUpper(chars[i + 1])) { if (char.IsSeparator(chars[i + 1])) { chars[i] = char.ToLowerInvariant(chars[i]); } break; } chars[i] = char.ToLowerInvariant(chars[i]); } return new string(chars); } } }