StringUtil.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System.Text;
  2. namespace PaySharp.Core.Utils
  3. {
  4. public enum StringCase
  5. {
  6. /// <summary>
  7. /// 蛇形策略
  8. /// </summary>
  9. Snake,
  10. /// <summary>
  11. /// 骆驼策略
  12. /// </summary>
  13. Camel,
  14. /// <summary>
  15. /// 小写策略
  16. /// </summary>
  17. Lower,
  18. /// <summary>
  19. /// 不执行策略
  20. /// </summary>
  21. None
  22. }
  23. internal enum SnakeCaseState
  24. {
  25. Start,
  26. Lower,
  27. Upper,
  28. NewWord
  29. }
  30. public static class StringUtil
  31. {
  32. /// <summary>
  33. /// 将字符串转换为蛇形策略
  34. /// </summary>
  35. /// <param name="s">字符串</param>
  36. /// <returns></returns>
  37. public static string ToSnakeCase(this string s)
  38. {
  39. if (string.IsNullOrEmpty(s))
  40. {
  41. return s;
  42. }
  43. var sb = new StringBuilder();
  44. var state = SnakeCaseState.Start;
  45. for (var i = 0; i < s.Length; i++)
  46. {
  47. if (s[i] == ' ')
  48. {
  49. if (state != SnakeCaseState.Start)
  50. {
  51. state = SnakeCaseState.NewWord;
  52. }
  53. }
  54. else if (char.IsUpper(s[i]))
  55. {
  56. switch (state)
  57. {
  58. case SnakeCaseState.Upper:
  59. var hasNext = i + 1 < s.Length;
  60. if (i > 0 && hasNext)
  61. {
  62. var nextChar = s[i + 1];
  63. if (!char.IsUpper(nextChar) && nextChar != '_')
  64. {
  65. sb.Append('_');
  66. }
  67. }
  68. break;
  69. case SnakeCaseState.Lower:
  70. case SnakeCaseState.NewWord:
  71. sb.Append('_');
  72. break;
  73. }
  74. sb.Append(char.ToLowerInvariant(s[i]));
  75. state = SnakeCaseState.Upper;
  76. }
  77. else if (s[i] == '_')
  78. {
  79. sb.Append('_');
  80. state = SnakeCaseState.Start;
  81. }
  82. else
  83. {
  84. if (state == SnakeCaseState.NewWord)
  85. {
  86. sb.Append('_');
  87. }
  88. sb.Append(s[i]);
  89. state = SnakeCaseState.Lower;
  90. }
  91. }
  92. return sb.ToString();
  93. }
  94. /// <summary>
  95. /// 将字符串转换为骆驼策略
  96. /// </summary>
  97. /// <param name="s">字符串</param>
  98. /// <returns></returns>
  99. public static string ToCamelCase(this string s)
  100. {
  101. if (string.IsNullOrEmpty(s) || !char.IsUpper(s[0]))
  102. {
  103. return s;
  104. }
  105. var chars = s.ToCharArray();
  106. for (var i = 0; i < chars.Length; i++)
  107. {
  108. if (i == 1 && !char.IsUpper(chars[i]))
  109. {
  110. break;
  111. }
  112. var hasNext = i + 1 < chars.Length;
  113. if (i > 0 && hasNext && !char.IsUpper(chars[i + 1]))
  114. {
  115. if (char.IsSeparator(chars[i + 1]))
  116. {
  117. chars[i] = char.ToLowerInvariant(chars[i]);
  118. }
  119. break;
  120. }
  121. chars[i] = char.ToLowerInvariant(chars[i]);
  122. }
  123. return new string(chars);
  124. }
  125. }
  126. }