StringHelper.cs 21 KB

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