StringUtil.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using System;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. namespace Top.Api.Util
  5. {
  6. public abstract class StringUtil
  7. {
  8. private const string pattern = @"^\d*$";
  9. private static readonly Regex REG_CIDR = new Regex("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/(\\d{1,2})$");
  10. public static bool IsNumeric(string obj)
  11. {
  12. if (obj == null)
  13. {
  14. return false;
  15. }
  16. char[] chars = obj.ToCharArray();
  17. int length = chars.Length;
  18. if (length < 1)
  19. return false;
  20. int i = 0;
  21. if (length > 1 && chars[0] == '-')
  22. i = 1;
  23. for (; i < length; i++)
  24. {
  25. if (!Char.IsDigit(chars[i]))
  26. {
  27. return false;
  28. }
  29. }
  30. return true;
  31. }
  32. public static bool IsDigits(string value)
  33. {
  34. if (string.IsNullOrEmpty(value))
  35. {
  36. return false;
  37. }
  38. return Regex.IsMatch(value, pattern);
  39. }
  40. public static string[] Split(string data, char separatorChar)
  41. {
  42. if (string.IsNullOrEmpty(data))
  43. {
  44. return null;
  45. }
  46. return data.Split(new char[] { separatorChar }, StringSplitOptions.RemoveEmptyEntries);
  47. }
  48. public static string ToCamelStyle(string name)
  49. {
  50. if (string.IsNullOrEmpty(name))
  51. {
  52. return name;
  53. }
  54. char[] chars = name.ToCharArray();
  55. StringBuilder buf = new StringBuilder(chars.Length);
  56. for (int i = 0; i < chars.Length; i++)
  57. {
  58. if (i == 0)
  59. {
  60. buf.Append(char.ToLower(chars[i]));
  61. }
  62. else
  63. {
  64. buf.Append(chars[i]);
  65. }
  66. }
  67. return buf.ToString();
  68. }
  69. public static string ToUnderlineStyle(string name)
  70. {
  71. if (string.IsNullOrEmpty(name))
  72. {
  73. return name;
  74. }
  75. StringBuilder buf = new StringBuilder();
  76. for (int i = 0; i < name.Length; i++)
  77. {
  78. char c = name[i];
  79. if (char.IsUpper(c))
  80. {
  81. if (i > 0)
  82. {
  83. buf.Append("_");
  84. }
  85. buf.Append(char.ToLower(c));
  86. }
  87. else
  88. {
  89. buf.Append(c);
  90. }
  91. }
  92. return buf.ToString();
  93. }
  94. public static string EscapeXml(string value)
  95. {
  96. if (string.IsNullOrEmpty(value))
  97. {
  98. return value;
  99. }
  100. StringBuilder buf = new StringBuilder();
  101. char[] chars = value.ToCharArray();
  102. for (int i = 0; i < chars.Length; i++)
  103. {
  104. char c = chars[i];
  105. switch (c)
  106. {
  107. case '<':
  108. buf.Append("&lt;");
  109. break;
  110. case '>':
  111. buf.Append("&gt;");
  112. break;
  113. case '\'':
  114. buf.Append("&apos;");
  115. break;
  116. case '&':
  117. buf.Append("&amp;");
  118. break;
  119. case '"':
  120. buf.Append("&quot;");
  121. break;
  122. default:
  123. if ((c == 0x9) || (c == 0xA) || (c == 0xD) || ((c >= 0x20) && (c <= 0xD7FF))
  124. || ((c >= 0xE000) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0x10FFFF)))
  125. {
  126. buf.Append(c);
  127. }
  128. break;
  129. }
  130. }
  131. return buf.ToString();
  132. }
  133. public static string FormatDateTime(DateTime dateTime)
  134. {
  135. return dateTime.ToString(Constants.DATE_TIME_FORMAT);
  136. }
  137. public static bool IsIpInRange(string ipAddr, string cidrAddr)
  138. {
  139. Match match = REG_CIDR.Match(cidrAddr);
  140. if (!match.Success)
  141. {
  142. throw new TopException("Invalid CIDR address: " + cidrAddr);
  143. }
  144. int[] minIpParts = new int[4];
  145. int[] maxIpParts = new int[4];
  146. string[] ipParts = match.Groups[1].Value.Split(new string[1] { "." }, StringSplitOptions.None);
  147. int intMask = int.Parse(match.Groups[2].Value);
  148. for (int i = 0; i < ipParts.Length; i++)
  149. {
  150. int ipPart = int.Parse(ipParts[i]);
  151. if (intMask > 8)
  152. {
  153. minIpParts[i] = ipPart;
  154. maxIpParts[i] = ipPart;
  155. intMask -= 8;
  156. }
  157. else if (intMask > 0)
  158. {
  159. minIpParts[i] = ipPart >> intMask;
  160. maxIpParts[i] = ipPart | (0xFF >> intMask);
  161. intMask = 0;
  162. }
  163. else
  164. {
  165. minIpParts[i] = 1;
  166. maxIpParts[i] = 0xFF - 1;
  167. }
  168. }
  169. string[] realIpParts = ipAddr.Split(new string[1] { "." }, StringSplitOptions.None);
  170. for (int i = 0; i < realIpParts.Length; i++)
  171. {
  172. int realIp = int.Parse(realIpParts[i]);
  173. if (realIp < minIpParts[i] || realIp > maxIpParts[i])
  174. {
  175. return false;
  176. }
  177. }
  178. return true;
  179. }
  180. }
  181. }