StringHelper.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. using System.Collections;
  2. using System.Security.Cryptography;
  3. namespace VberZero.Tools.StringModel;
  4. public static class StringHelper
  5. {
  6. #region STRING
  7. /// <summary>
  8. /// 检查空字符串
  9. /// </summary>
  10. /// <param name="str"></param>
  11. /// <returns></returns>
  12. public static bool NotEmpty(this string str)
  13. {
  14. return !Empty(str);
  15. }
  16. /// <summary>
  17. /// 检查空字符串
  18. /// </summary>
  19. /// <param name="str"></param>
  20. /// <returns></returns>
  21. public static bool Empty(this string str)
  22. {
  23. return string.IsNullOrEmpty(str);
  24. }
  25. /// <summary>
  26. /// 大写并移除空白字符串
  27. /// </summary>
  28. /// <param name="str"></param>
  29. /// <returns></returns>
  30. public static string UAndT(this string? str)
  31. {
  32. str ??= "";
  33. return str.ToUpper().Trim();
  34. }
  35. /// <summary>
  36. /// 大写并移除空白字符串
  37. /// </summary>
  38. /// <param name="obj"></param>
  39. /// <returns></returns>
  40. public static string UAndT(this object obj)
  41. {
  42. return UAndT(obj.ToString());
  43. }
  44. /// <summary>
  45. /// 检查是否以某字符串开头,不是加上此字符串
  46. /// </summary>
  47. /// <param name="str"></param>
  48. /// <param name="startStr"></param>
  49. /// <returns></returns>
  50. public static string Sw(this string str, string startStr)
  51. {
  52. return str.StartsWith(startStr) ? str : $"{startStr}{str}";
  53. }
  54. /// <summary>
  55. /// 检查是否以某字符串结尾,不是加上此字符串
  56. /// </summary>
  57. /// <param name="str"></param>
  58. /// <param name="endStr"></param>
  59. /// <returns></returns>
  60. public static string Ew(this string str, string endStr)
  61. {
  62. return str!.EndsWith(endStr) ? str : $"{str}{endStr}";
  63. }
  64. /// <summary>
  65. /// 前补全
  66. /// </summary>
  67. /// <param name="i"></param>
  68. /// <param name="num"></param>
  69. /// <param name="charStr"></param>
  70. /// <returns></returns>
  71. public static string LeftPad(this int i, int num, string charStr = "0")
  72. {
  73. return i.ToString().PadLeft(num, Convert.ToChar(charStr));
  74. }
  75. /// <summary>
  76. /// 后补全
  77. /// </summary>
  78. /// <param name="i"></param>
  79. /// <param name="num"></param>
  80. /// <param name="charStr"></param>
  81. /// <returns></returns>
  82. public static string RightPad(this int i, int num, string charStr = "0")
  83. {
  84. return i.ToString().PadRight(num, Convert.ToChar(charStr));
  85. }
  86. /// <summary>
  87. /// 前补全
  88. /// </summary>
  89. /// <param name="s"></param>
  90. /// <param name="num"></param>
  91. /// <param name="charStr"></param>
  92. /// <returns></returns>
  93. public static string LeftPad(this string s, int num, string charStr = "0")
  94. {
  95. return s.PadLeft(num, Convert.ToChar(charStr));
  96. }
  97. /// <summary>
  98. /// 后补全
  99. /// </summary>
  100. /// <param name="s"></param>
  101. /// <param name="num"></param>
  102. /// <param name="charStr"></param>
  103. /// <returns></returns>
  104. public static string RightPad(this string s, int num, string charStr = "0")
  105. {
  106. return s.PadRight(num, Convert.ToChar(charStr));
  107. }
  108. /// <summary>
  109. /// 复制
  110. /// </summary>
  111. /// <param name="str"></param>
  112. /// <param name="count">复制次数</param>
  113. /// <returns></returns>
  114. public static string Replicate(this string str, int count)
  115. {
  116. string str2 = "";
  117. for (int index = 0; index < count; ++index)
  118. str2 += str;
  119. return str2;
  120. }
  121. /// <summary>
  122. /// 末尾移除匹配
  123. /// </summary>
  124. /// <param name="source"></param>
  125. /// <param name="removeStr"></param>
  126. /// <returns></returns>
  127. public static string TrimEnd(string source, string removeStr)
  128. {
  129. char[] charArray = removeStr.ToCharArray();
  130. return source.TrimEnd(charArray);
  131. }
  132. public static string GetRandom(int min = 0, int max = 9999)
  133. {
  134. var random = RandomNumberGenerator.GetInt32(min, max);
  135. return "R" + random;
  136. }
  137. public static string FormatXml2Code(this string str)
  138. {
  139. return str.Replace(";amp;", "&").Replace(";lt;", "<").Replace(";gt;", ">");
  140. }
  141. public static string FormatCode2Xml(this string str)
  142. {
  143. return str.Replace("&", ";amp;").Replace("<", ";lt;").Replace(">", ";gt;");
  144. }
  145. public static string AddStr(this string source, object toBeAppended)
  146. {
  147. source = source.Trim();
  148. if (source == "")
  149. {
  150. return GetDelimitedStr(toBeAppended);
  151. }
  152. if ((source[0] == '[') && (source[^1] == ']'))
  153. {
  154. return (source + $",[{toBeAppended.ToString()?.Trim()}]");
  155. }
  156. return JoinString(source, toBeAppended);
  157. }
  158. public static string JoinString(this object first, object second)
  159. {
  160. return $"[{first.ToString()?.Trim()}],[{second.ToString()?.Trim()}]";
  161. }
  162. public static string JoinString(this object first, object[] second)
  163. {
  164. var str = "";
  165. foreach (var o in second)
  166. {
  167. str += $",[{o.ToString()?.Trim()}]";
  168. }
  169. return $"[{first.ToString()?.Trim()}]{str}";
  170. }
  171. public static string JoinString(this object[] second)
  172. {
  173. var str = "";
  174. foreach (var o in second)
  175. {
  176. str += (str == "" ? "" : ",") + $"[{o.ToString()?.Trim()}]";
  177. }
  178. return str;
  179. }
  180. public static string JoinString(this object first, object second, object poThird)
  181. {
  182. return $"[{first.ToString()?.Trim()}],[{second.ToString()?.Trim()}], [{poThird.ToString()?.Trim()}]";
  183. }
  184. public static string JoinString(this object first, object second, object poThird, object poFourth)
  185. {
  186. return
  187. $"[{first.ToString()?.Trim()}],[{second.ToString()?.Trim()}], [{poThird.ToString()?.Trim()}], [{poFourth.ToString()?.Trim()}]";
  188. }
  189. public static string AppendToStr(this string source, object toBeAppended)
  190. {
  191. string delimitedStr = GetDelimitedStr(toBeAppended);
  192. source = source.Trim();
  193. if (source != "")
  194. {
  195. delimitedStr = source + "," + delimitedStr;
  196. }
  197. return delimitedStr;
  198. }
  199. #endregion STRING
  200. #region INT,DECIMAL,BOOL
  201. /// <summary>
  202. /// 验证int,并返回
  203. /// </summary>
  204. /// <param name="str"></param>
  205. /// <returns></returns>
  206. public static int ValI(this string str)
  207. {
  208. return (int)ValD(str);
  209. }
  210. /// <summary>
  211. /// 验证decimal,并返回
  212. /// </summary>
  213. /// <param name="str"></param>
  214. /// <returns></returns>
  215. public static decimal ValD(this string str)
  216. {
  217. string str1 = "";
  218. foreach (var ch in str)
  219. {
  220. if (ch != ' ' && ch != ',')
  221. {
  222. if (ch >= '0' && ch <= '9')
  223. str1 += ch.ToString();
  224. else if ((ch == '+' || ch == '-') && str1 == "")
  225. str1 += ch.ToString();
  226. else if (ch == '.' && str1.IndexOf(ch) < 0)
  227. str1 += ch.ToString();
  228. else
  229. break;
  230. }
  231. }
  232. if (str1 == "")
  233. str1 = "0";
  234. else if (str1 == "-")
  235. str1 = "-0";
  236. return Convert.ToDecimal(str1);
  237. }
  238. /// <summary>
  239. /// int转bool (true,yes,y,>1)
  240. /// </summary>
  241. /// <param name="i"></param>
  242. /// <returns></returns>
  243. public static bool ValB(this int i)
  244. {
  245. var str = i > 0 ? "1" : "0";
  246. return StrToBool(str);
  247. }
  248. /// <summary>
  249. /// 字符串转bool (true,yes,y,1)
  250. /// </summary>
  251. /// <param name="str"></param>
  252. /// <returns></returns>
  253. public static bool ValB(this string? str)
  254. {
  255. return StrToBool(str);
  256. }
  257. /// <summary>
  258. /// 字符串转bool (true,yes,y,1)
  259. /// </summary>
  260. /// <param name="str"></param>
  261. /// <returns></returns>
  262. public static bool StrToBool(this string? str)
  263. {
  264. bool flag = false;
  265. str = UAndT(str);
  266. if (str == "TRUE" || str == "YES" || str == "Y" || str == "1")
  267. flag = true;
  268. return flag;
  269. }
  270. #endregion INT,DECIMAL,BOOL
  271. #region Array
  272. /// <summary>
  273. /// 字符转数组
  274. /// </summary>
  275. /// <param name="str"></param>
  276. /// <param name="separator">分隔符默认:,</param>
  277. /// <returns></returns>
  278. public static string?[] StrToArray(this string str, string separator = ",")
  279. {
  280. return (string?[])StrToArrayEx(str, separator);
  281. }
  282. /// <summary>
  283. /// 字符转数组
  284. /// </summary>
  285. /// <param name="str"></param>
  286. /// <param name="separator">分隔符默认:,</param>
  287. /// <returns></returns>
  288. public static Array StrToArrayEx(this string? str, string separator = ",")
  289. {
  290. ArrayList arrayList = new ArrayList();
  291. str = str == null ? "" : str.Trim();
  292. int length1 = separator.Length;
  293. int length2;
  294. for (; str.Length > 0; str = length2 + length1 <= str.Length ? str.Substring(length2 + length1).Trim() : "")
  295. {
  296. length2 = str.IndexOf(separator, StringComparison.Ordinal);
  297. int num1 = str.IndexOf("[", StringComparison.Ordinal);
  298. if (num1 >= 0 && num1 < length2)
  299. {
  300. int num2 = 1;
  301. int length3 = str.Length;
  302. int startIndex;
  303. for (startIndex = num1 + 1; startIndex < length3; ++startIndex)
  304. {
  305. switch (str[startIndex])
  306. {
  307. case '[':
  308. ++num2;
  309. break;
  310. case ']':
  311. --num2;
  312. break;
  313. }
  314. if (num2 == 0)
  315. break;
  316. }
  317. length2 = str.IndexOf(separator, startIndex, StringComparison.Ordinal);
  318. }
  319. if (length2 < 0)
  320. length2 = str.Length;
  321. string str1 = str.Substring(0, length2);
  322. int length4 = str1.Length;
  323. if (length4 > 0 && str1[0] == '[' && str1[length4 - 1] == ']')
  324. str1 = str1.Substring(1, length4 - 2);
  325. arrayList.Add(str1.Trim());
  326. }
  327. Array instance = new string[arrayList.Count];
  328. arrayList.CopyTo(instance);
  329. return instance;
  330. }
  331. /// <summary>
  332. /// 数组转字符串 (分隔符:,)
  333. /// </summary>
  334. /// <param name="paStr"></param>
  335. /// <param name="delimited"></param>
  336. /// <returns></returns>
  337. public static string ArrayToStr(this Array paStr, bool delimited = false)
  338. {
  339. return ArrayToStr(paStr, ",", delimited);
  340. }
  341. /// <summary>
  342. /// 数组转字符串
  343. /// </summary>
  344. /// <param name="paStr"></param>
  345. /// <param name="separator"></param>
  346. /// <param name="delimited">是否加界定符“[]”</param>
  347. /// <returns></returns>
  348. public static string ArrayToStr(this Array paStr, string separator, bool delimited = false)
  349. {
  350. string str1 = "";
  351. foreach (string str2 in paStr)
  352. str1 = str1 + (str1 == "" ? "" : separator) + (delimited ? GetDelimitedStr(str2) : str2);
  353. return str1;
  354. }
  355. /// <summary>
  356. /// 加上界定符
  357. /// </summary>
  358. /// <param name="obj"></param>
  359. /// <returns></returns>
  360. public static string GetDelimitedStr(object obj)
  361. {
  362. return "[" + obj + "]";
  363. }
  364. /// <summary>
  365. /// 改编
  366. /// </summary>
  367. /// <param name="arr"></param>
  368. /// <param name="from"></param>
  369. /// <param name="to"></param>
  370. /// <returns></returns>
  371. public static Array RearrangeArray(this Array arr, int from, int to)
  372. {
  373. Array instance = new object[arr.Length];
  374. arr.CopyTo(instance, 0);
  375. object? obj = instance.GetValue(from);
  376. if (from > to)
  377. {
  378. for (int index = from - 1; index >= to; --index)
  379. instance.SetValue(instance.GetValue(index), index + 1);
  380. }
  381. else
  382. {
  383. for (int index = from + 1; index <= to; ++index)
  384. instance.SetValue(instance.GetValue(index), index - 1);
  385. }
  386. instance.SetValue(obj, to);
  387. return instance;
  388. }
  389. /// <summary>
  390. /// 数组转数组List
  391. /// </summary>
  392. /// <param name="arr"></param>
  393. /// <returns></returns>
  394. public static ArrayList ArrayToArrayList(this Array arr)
  395. {
  396. ArrayList arrayList = new ArrayList();
  397. foreach (object obj in arr)
  398. arrayList.Add(obj);
  399. return arrayList;
  400. }
  401. /// <summary>
  402. /// 移除
  403. /// </summary>
  404. /// <param name="arr"></param>
  405. /// <param name="obj"></param>
  406. /// <returns></returns>
  407. public static Array RemoveFromArray(this Array arr, object obj)
  408. {
  409. ArrayList arrayList = ArrayToArrayList(arr);
  410. arrayList.Remove(obj);
  411. Array instance = new object[arrayList.Count];
  412. arrayList.CopyTo(instance);
  413. return instance;
  414. }
  415. /// <summary>
  416. /// 数组list 插入(按字符串长度排序)
  417. /// </summary>
  418. /// <param name="poArrayList"></param>
  419. /// <param name="pcName"></param>
  420. public static void InsertIdentifier(this ArrayList poArrayList, string pcName)
  421. {
  422. int index = 0;
  423. while (index < poArrayList.Count)
  424. {
  425. string? str = poArrayList[index]?.ToString();
  426. if (str == pcName)
  427. {
  428. index = -1;
  429. break;
  430. }
  431. if (str?.Length < pcName.Length)
  432. {
  433. break;
  434. }
  435. index++;
  436. }
  437. if (index >= 0)
  438. {
  439. poArrayList.Insert(index, pcName);
  440. }
  441. }
  442. #endregion Array
  443. #region DateTime
  444. /// <summary>
  445. /// 时间转字符串
  446. /// </summary>
  447. /// <param name="dateTime"></param>
  448. /// <returns></returns>
  449. public static string DtToStr(this DateTime dateTime)
  450. {
  451. return dateTime.ToString("s").Replace("T", " ");
  452. }
  453. /// <summary>
  454. /// 字符串转时间
  455. /// </summary>
  456. /// <param name="str"></param>
  457. /// <returns></returns>
  458. public static DateTime StrToDt(this string str)
  459. {
  460. DateTime dateTime = new DateTime(1900, 1, 1);
  461. try
  462. {
  463. dateTime = DateTime.Parse(str);
  464. }
  465. catch (Exception)
  466. {
  467. // ignored
  468. }
  469. return dateTime;
  470. }
  471. /// <summary>
  472. /// 日期转指定格式日期(默认yyyyMMddHHmmss)
  473. /// </summary>
  474. /// <param name="dateTime"></param>
  475. /// <param name="formatter"></param>
  476. /// <returns></returns>
  477. public static string DtToStrFormatter(this DateTime dateTime, string formatter = "yyyyMMddHHmmss")
  478. {
  479. return dateTime.ToString(formatter);
  480. }
  481. /// <summary>
  482. /// 日期转时间字符串
  483. /// </summary>
  484. /// <param name="dateTime"></param>
  485. /// <returns></returns>
  486. public static string DtToTimeStr(this DateTime dateTime)
  487. {
  488. return dateTime.ToString("T");
  489. }
  490. /// <summary>
  491. /// 日期转日期字符串
  492. /// </summary>
  493. /// <param name="dateTime"></param>
  494. /// <returns></returns>
  495. public static string DtToDateStr(this DateTime dateTime)
  496. {
  497. return dateTime.ToString("d");
  498. }
  499. /// <summary>
  500. /// 获取秒
  501. /// </summary>
  502. /// <param name="dateTime"></param>
  503. /// <returns></returns>
  504. public static int DtToSeconds(this DateTime dateTime)
  505. {
  506. return dateTime.TimeOfDay.Seconds;
  507. }
  508. /// <summary>
  509. /// 今天之后多少秒
  510. /// </summary>
  511. /// <param name="seconds"></param>
  512. /// <returns></returns>
  513. public static DateTime DtFromSeconds(int seconds)
  514. {
  515. return DateTime.Today + new TimeSpan(0, 0, seconds);
  516. }
  517. /// <summary>
  518. /// 时间差(分)
  519. /// </summary>
  520. /// <param name="start"></param>
  521. /// <param name="end"></param>
  522. /// <returns></returns>
  523. public static int GetTimeSpanMinute(this DateTime start, DateTime end)
  524. {
  525. return Convert.ToInt32(GetTimeSpan(start, end).TotalMinutes);
  526. }
  527. /// <summary>
  528. /// 时间差
  529. /// </summary>
  530. /// <param name="start"></param>
  531. /// <param name="end"></param>
  532. /// <returns></returns>
  533. public static TimeSpan GetTimeSpan(this DateTime start, DateTime end)
  534. {
  535. TimeSpan timeSpan = end - start;
  536. return timeSpan;
  537. }
  538. #endregion DateTime
  539. }