StringExtensions.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading.Tasks;
  7. namespace Business.Core.Utilities
  8. {
  9. public static class StringExtensions
  10. {
  11. /// <summary>
  12. /// 去掉字符串所有空格
  13. /// </summary>
  14. /// <param name="str">字符串</param>
  15. /// <returns></returns>
  16. public static string TrimAll(this string? str)
  17. {
  18. return string.IsNullOrWhiteSpace(str) ? string.Empty : Regex.Replace(str, @"\s", "");
  19. }
  20. /// <summary>
  21. /// 去掉空格,如果为null或Empty则返回string.Empty
  22. /// </summary>
  23. /// <param name="str"></param>
  24. /// <returns></returns>
  25. public static string TrimNullOrEmpty(this string? str)
  26. {
  27. return string.IsNullOrEmpty(str) ? string.Empty : str.Trim();
  28. }
  29. /// <summary>
  30. /// 转换为不为空的字符串
  31. /// </summary>
  32. /// <param name="str">字符串</param>
  33. /// <returns>如果字符串为null返回string.Empty,否则返回字符串本身。</returns>
  34. public static string ToEmptyString(this string? str)
  35. {
  36. return string.IsNullOrEmpty(str) ? string.Empty : str;
  37. }
  38. /// <summary>
  39. /// 将字符串分割为数组
  40. /// </summary>
  41. /// <param name="str">要分割的字符串</param>
  42. /// <param name="separator">分隔符</param>
  43. /// <param name="options">分割选项</param>
  44. /// <returns>字符串数组</returns>
  45. public static string[] SplitToArray(this string? str, string separator = ",", StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries)
  46. {
  47. return string.IsNullOrWhiteSpace(str) ? Array.Empty<string>() : str.Split(separator, options);
  48. }
  49. /// <summary>
  50. /// 将字符串分割为long数组
  51. /// </summary>
  52. /// <param name="str">要分割的字符串</param>
  53. /// <param name="separator">分隔符</param>
  54. /// <param name="options">分割选项</param>
  55. /// <returns>long List</returns>
  56. public static List<long> SplitToLongList(this string? str, string separator = ",", StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries)
  57. {
  58. string[] array = str.SplitToArray(separator, options);
  59. var list = new List<long>();
  60. foreach (string a in array)
  61. {
  62. if (a.IsLong(out long l))
  63. {
  64. list.Add(l);
  65. }
  66. }
  67. return list;
  68. }
  69. /// <summary>
  70. /// 将字符串分割为int数组
  71. /// </summary>
  72. /// <param name="str">要分割的字符串</param>
  73. /// <param name="separator">分隔符</param>
  74. /// <param name="options">分割选项</param>
  75. /// <returns>int List</returns>
  76. public static List<int> SplitToIntList(this string? str, string separator = ",", StringSplitOptions options = StringSplitOptions.RemoveEmptyEntries)
  77. {
  78. string[] array = str.SplitToArray(separator, options);
  79. var list = new List<int>();
  80. foreach (string a in array)
  81. {
  82. if (a.IsInt(out int i))
  83. {
  84. list.Add(i);
  85. }
  86. }
  87. return list;
  88. }
  89. /// <summary>
  90. /// 判断字符串是否是int类型数字
  91. /// </summary>
  92. /// <param name="str">字符串</param>
  93. /// <returns></returns>
  94. public static bool IsInt(this string? str)
  95. {
  96. return int.TryParse(str, out _);
  97. }
  98. /// <summary>
  99. /// 判断字符串是否是int类型数字
  100. /// </summary>
  101. /// <param name="str">字符串</param>
  102. /// <param name="i">如果是数字返回int</param>
  103. /// <returns></returns>
  104. public static bool IsInt(this string? str, out int i)
  105. {
  106. return int.TryParse(str, out i);
  107. }
  108. /// <summary>
  109. /// 将字符串转换为int
  110. /// </summary>
  111. /// <param name="str">字符串</param>
  112. /// <param name="defaultValue">转换失败时的默认值</param>
  113. /// <returns></returns>
  114. public static int ToInt(this string? str, int defaultValue = 0)
  115. {
  116. return str.IsInt(out int i) ? i : defaultValue;
  117. }
  118. /// <summary>
  119. /// 判断字符串是否是long类型数字
  120. /// </summary>
  121. /// <param name="str">字符串</param>
  122. /// <returns></returns>
  123. public static bool IsLong(this string? str)
  124. {
  125. return long.TryParse(str, out _);
  126. }
  127. /// <summary>
  128. /// 判断字符串是否是long类型数字
  129. /// </summary>
  130. /// <param name="str">字符串</param>
  131. /// <param name="i">如果是数字返回long</param>
  132. /// <returns></returns>
  133. public static bool IsLong(this string? str, out long l)
  134. {
  135. return long.TryParse(str, out l);
  136. }
  137. /// <summary>
  138. /// 将字符串转换为long
  139. /// </summary>
  140. /// <param name="str">字符串</param>
  141. /// <param name="defaultValue">转换失败时的默认值</param>
  142. /// <returns></returns>
  143. public static long ToLong(this string? str, long defaultValue = 0)
  144. {
  145. return str.IsLong(out long l) ? l : defaultValue;
  146. }
  147. /// <summary>
  148. /// 判断字符串是否是decimal类型数字
  149. /// </summary>
  150. /// <param name="str">字符串</param>
  151. /// <returns></returns>
  152. public static bool IsDecimal(this string? str)
  153. {
  154. return decimal.TryParse(str, out _);
  155. }
  156. /// <summary>
  157. /// 判断字符串是否是decimal类型数字
  158. /// </summary>
  159. /// <param name="str">字符串</param>
  160. /// <returns></returns>
  161. public static bool IsDecimal(this string? str, out decimal d)
  162. {
  163. return decimal.TryParse(str, out d);
  164. }
  165. /// <summary>
  166. /// 字符串转换为decimal类型数字
  167. /// </summary>
  168. /// <param name="str">字符串</param>
  169. /// <param name="defaultValue">转换失败时的默认值</param>
  170. /// <returns></returns>
  171. public static decimal ToDecimal(this string? str, decimal defaultValue = 0)
  172. {
  173. return str.IsDecimal(out decimal d) ? d : defaultValue;
  174. }
  175. /// <summary>
  176. /// 判断字符串是否是float类型数字
  177. /// </summary>
  178. /// <param name="str">字符串</param>
  179. /// <returns></returns>
  180. public static bool IsFloat(this string? str, out float f)
  181. {
  182. return float.TryParse(str, out f);
  183. }
  184. /// <summary>
  185. /// 字符串转换为float类型数字
  186. /// </summary>
  187. /// <param name="str">字符串</param>
  188. /// <param name="defaultValue">转换失败时的默认值</param>
  189. /// <returns></returns>
  190. public static float ToFloat(this string? str, float defaultValue = 0)
  191. {
  192. return str.IsFloat(out float f) ? f : defaultValue;
  193. }
  194. /// <summary>
  195. /// 判断字符串是否是double类型数字
  196. /// </summary>
  197. /// <param name="str">字符串</param>
  198. /// <returns></returns>
  199. public static bool IsDouble(this string? str, out double d)
  200. {
  201. return double.TryParse(str, out d);
  202. }
  203. /// <summary>
  204. /// 字符串转换为double类型数字
  205. /// </summary>
  206. /// <param name="str">字符串</param>
  207. /// <param name="defaultValue">转换失败时的默认值</param>
  208. /// <returns></returns>
  209. public static double ToDouble(this string? str, double defaultValue = 0)
  210. {
  211. return str.IsDouble(out double d) ? d : defaultValue;
  212. }
  213. /// <summary>
  214. /// 判断字符串是否为bool类型
  215. /// </summary>
  216. /// <param name="str">字符串</param>
  217. /// <param name="b"></param>
  218. /// <returns>如果字符串为"1"或"true"(不区分大小写,去掉所有空格)时返回true否则返回false</returns>
  219. public static bool IsBool(this string? str)
  220. {
  221. if (string.IsNullOrEmpty(str))
  222. {
  223. return false;
  224. }
  225. string str1 = str.TrimAll();
  226. return "true".EqualsIgnoreCase(str1) || "1".Equals(str1);
  227. }
  228. /// <summary>
  229. /// 将字符串转换为bool
  230. /// </summary>
  231. /// <param name="str">字符串</param>
  232. /// <returns>如果字符串为1或true(不区分大小写),则返回true,否则返回false</returns>
  233. public static bool ToBool(this string? str)
  234. {
  235. return str.IsBool();
  236. }
  237. /// <summary>
  238. /// 判断一个字符串是否是日期时间类型
  239. /// </summary>
  240. /// <param name="str">字符串</param>
  241. /// <param name="dt">输出转换后的日期时间</param>
  242. /// <returns></returns>
  243. public static bool IsDateTime(this string? str, out DateTime dt)
  244. {
  245. return DateTime.TryParse(str, out dt);
  246. }
  247. /// <summary>
  248. /// 判断一个字符串是否是日期时间类型
  249. /// </summary>
  250. /// <param name="str">字符串</param>
  251. /// <returns></returns>
  252. public static bool IsDateTime(this string? str)
  253. {
  254. return str.IsDateTime(out _);
  255. }
  256. /// <summary>
  257. /// 将字符串转换为时间时间
  258. /// </summary>
  259. /// <param name="str">要转换的字符串</param>
  260. /// <param name="defaultValue">转换失败时返回的默认值</param>
  261. /// <returns></returns>
  262. public static DateTime ToDateTime(this string? str, DateTime defaultValue)
  263. {
  264. return str.IsDateTime(out DateTime dt) ? dt : defaultValue;
  265. }
  266. /// <summary>
  267. /// 将字符串转换为时间时间
  268. /// </summary>
  269. /// <param name="str">要转换的字符串</param>
  270. /// <param name="defaultValue">转换失败时返回的默认值</param>
  271. /// <returns>如果转换失败则返回null</returns>
  272. public static DateTime? ToDateTime(this string? str)
  273. {
  274. return str.IsDateTime(out DateTime dt) ? dt : new DateTime?();
  275. }
  276. /// <summary>
  277. /// 比较字符串区分大小写
  278. /// </summary>
  279. /// <param name="str">字符串</param>
  280. /// <param name="str1">要比较的字符串</param>
  281. /// <returns>是否相同</returns>
  282. public static bool EqualsCase(this string? str, string? str1)
  283. {
  284. return string.Equals(str, str1);
  285. }
  286. /// <summary>
  287. /// 比较字符串是否与参数中任意一个字符串相等
  288. /// </summary>
  289. /// <param name="str">字符串</param>
  290. /// <param name="strs">要比较的字符串</param>
  291. /// <returns>是否与参数中任意一个字符串相等</returns>
  292. public static bool EqualsAny(this string? str, params string[] strs)
  293. {
  294. if (string.IsNullOrEmpty(str))
  295. {
  296. return false;
  297. }
  298. foreach (string s in strs)
  299. {
  300. if (s.Equals(str))
  301. {
  302. return true;
  303. }
  304. }
  305. return false;
  306. }
  307. /// <summary>
  308. /// 判断字符串与参数中的字符串都不相等
  309. /// </summary>
  310. /// <param name="str">字符串</param>
  311. /// <param name="strs">要比较的字符串</param>
  312. /// <returns></returns>
  313. public static bool NotEqualsAny(this string? str, params string[] strs)
  314. {
  315. if (string.IsNullOrEmpty(str))
  316. {
  317. return false;
  318. }
  319. foreach (string s in strs)
  320. {
  321. if (s.Equals(str))
  322. {
  323. return false;
  324. }
  325. }
  326. return true;
  327. }
  328. /// <summary>
  329. /// 比较字符串不区分大小写
  330. /// </summary>
  331. /// <param name="str">字符串</param>
  332. /// <param name="str1">要比较的字符串</param>
  333. /// <returns>是否相同</returns>
  334. public static bool EqualsIgnoreCase(this string? str, string? str1)
  335. {
  336. return string.Equals(str, str1, StringComparison.CurrentCultureIgnoreCase);
  337. }
  338. /// <summary>
  339. /// 比较字符串是否与参数中任意一个字符串相等(不区分大小写)
  340. /// </summary>
  341. /// <param name="str">字符串</param>
  342. /// <param name="strs">要比较的字符串</param>
  343. /// <returns>是否与参数中任意一个字符串相等</returns>
  344. public static bool EqualsAnyIgnoreCase(this string? str, params string[] strs)
  345. {
  346. if (string.IsNullOrEmpty(str))
  347. {
  348. return false;
  349. }
  350. foreach (string s in strs)
  351. {
  352. if (s.Equals(str, StringComparison.CurrentCultureIgnoreCase))
  353. {
  354. return true;
  355. }
  356. }
  357. return false;
  358. }
  359. /// <summary>
  360. /// 判断字符串与参数中的字符串都不相等(不区分大小写)
  361. /// </summary>
  362. /// <param name="str">字符串</param>
  363. /// <param name="strs">要比较的字符串</param>
  364. /// <returns>是否与参数中任意一个字符串相等</returns>
  365. public static bool NotEqualsAnyIgnoreCase(this string? str, params string[] strs)
  366. {
  367. if (string.IsNullOrEmpty(str))
  368. {
  369. return false;
  370. }
  371. foreach (string s in strs)
  372. {
  373. if (s.Equals(str, StringComparison.CurrentCultureIgnoreCase))
  374. {
  375. return false;
  376. }
  377. }
  378. return true;
  379. }
  380. /// <summary>
  381. /// 判断字符串中是否包含str1字符串(区分大小写)
  382. /// </summary>
  383. /// <param name="str">字符串</param>
  384. /// <param name="str1">被包含的字符串</param>
  385. /// <param name="stringComparison">StringComparison</param>
  386. /// <returns></returns>
  387. public static bool ContainsCase(this string? str, string? str1)
  388. {
  389. return str != null && str1 != null && str.Contains(str1);
  390. }
  391. /// <summary>
  392. /// 判断字符串中是否包含str1字符串(不区分大小写)
  393. /// </summary>
  394. /// <param name="str">字符串</param>
  395. /// <param name="str1">被包含的字符串</param>
  396. /// <returns></returns>
  397. public static bool ContainsIgnoreCase(this string? str, string? str1)
  398. {
  399. return str != null && str1 != null && str.Contains(str1, StringComparison.CurrentCultureIgnoreCase);
  400. }
  401. /// <summary>
  402. /// 判断字符串出现的位置(为区分大小写)
  403. /// </summary>
  404. /// <param name="str">字符串</param>
  405. /// <param name="str1">子字符串</param>
  406. /// <returns></returns>
  407. public static int IndexOfIgnoreCase(this string? str, string str1)
  408. {
  409. return str == null ? -1 : str.IndexOf(str1, StringComparison.CurrentCultureIgnoreCase);
  410. }
  411. /// <summary>
  412. /// 去掉开头的字符串
  413. /// </summary>
  414. /// <param name="str">要去掉的字符串</param>
  415. /// <param name="trimString">开头的字符串</param>
  416. /// <returns></returns>
  417. public static string TrimStartString(this string? str, string trimString)
  418. {
  419. return string.IsNullOrWhiteSpace(str) ? string.Empty : !str.StartsWith(trimString) ? str : str.Substring(trimString.Length);
  420. }
  421. /// <summary>
  422. /// 去掉开头的字符串(不区分大小写)
  423. /// </summary>
  424. /// <param name="str">要去掉的字符串</param>
  425. /// <param name="trimString">开头的字符串</param>
  426. /// <returns></returns>
  427. public static string TrimStartStringIgnoreCase(this string? str, string trimString)
  428. {
  429. return string.IsNullOrWhiteSpace(str) ? string.Empty : !str.StartsWithIgnoreCase(trimString) ? str : str.Substring(trimString.Length);
  430. }
  431. /// <summary>
  432. /// 去掉结尾的字符串
  433. /// </summary>
  434. /// <param name="str">要去掉的字符串</param>
  435. /// <param name="trimString">结尾的字符串</param>
  436. /// <returns></returns>
  437. public static string TrimEndString(this string? str, string trimString)
  438. {
  439. return string.IsNullOrWhiteSpace(str) ? string.Empty : !str.EndsWith(trimString) ? str : str.Substring(0, str.Length - trimString.Length);
  440. }
  441. /// <summary>
  442. /// 去掉结尾的字符串(不区分大小写)
  443. /// </summary>
  444. /// <param name="str">要去掉的字符串</param>
  445. /// <param name="trimString">结尾的字符串</param>
  446. /// <returns></returns>
  447. public static string TrimEndStringIgnoreCase(this string? str, string trimString)
  448. {
  449. return string.IsNullOrWhiteSpace(str) ? string.Empty : !str.EndsWithIgnoreCase(trimString) ? str : str.Substring(0, str.Length - trimString.Length);
  450. }
  451. /// <summary>
  452. /// 是否是以字符串数组参数中任意一个字符串开头的字符串
  453. /// </summary>
  454. /// <param name="str">字符串</param>
  455. /// <param name="values">开头的字符串数组</param>
  456. /// <returns></returns>
  457. public static bool StartsWithAny(this string? str, params string[] values)
  458. {
  459. if (string.IsNullOrEmpty(str))
  460. {
  461. return false;
  462. }
  463. foreach (string value in values)
  464. {
  465. if (str.StartsWith(value))
  466. {
  467. return true;
  468. }
  469. }
  470. return false;
  471. }
  472. /// <summary>
  473. /// 是否是以字符串数组参数中任意一个字符串开头的字符串
  474. /// </summary>
  475. /// <param name="str">字符串</param>
  476. /// <param name="stringComparison">StringComparison, 可设置是否区分大小写</param>
  477. /// <param name="values">开头的字符串数组</param>
  478. /// <returns></returns>
  479. public static bool StartsWithAny(this string? str, StringComparison stringComparison, params string[] values)
  480. {
  481. if (string.IsNullOrEmpty(str))
  482. {
  483. return false;
  484. }
  485. foreach (string value in values)
  486. {
  487. if (str.StartsWith(value, stringComparison))
  488. {
  489. return true;
  490. }
  491. }
  492. return false;
  493. }
  494. /// <summary>
  495. /// 判断字符串是否以某个字符串开头(不区分大小写)
  496. /// </summary>
  497. /// <param name="str">要判断的字符串</param>
  498. /// <param name="startString">开头的字符串</param>
  499. /// <returns></returns>
  500. public static bool StartsWithIgnoreCase(this string? str, string startString)
  501. {
  502. return !string.IsNullOrEmpty(str) && str.StartsWith(startString, StringComparison.CurrentCultureIgnoreCase);
  503. }
  504. /// <summary>
  505. /// 判断字符串是否以某个字符串结尾(不区分大小写)
  506. /// </summary>
  507. /// <param name="str">要判断的字符串</param>
  508. /// <param name="startString">结尾的字符串</param>
  509. /// <returns></returns>
  510. public static bool EndsWithIgnoreCase(this string? str, string startString)
  511. {
  512. return !string.IsNullOrEmpty(str) && str.EndsWith(startString, StringComparison.CurrentCultureIgnoreCase);
  513. }
  514. /// <summary>
  515. /// 替换字符串,不区分大不写
  516. /// </summary>
  517. /// <param name="str">字符串</param>
  518. /// <param name="oldValue">要替换的字符串</param>
  519. /// <param name="newValue">新字符串</param>
  520. /// <returns></returns>
  521. public static string ReplaceIgnoreCase(this string? str, string oldValue, string? newValue)
  522. {
  523. return string.IsNullOrEmpty(str) ? string.Empty : str.Replace(oldValue, newValue, StringComparison.CurrentCultureIgnoreCase);
  524. }
  525. /// <summary>
  526. /// 将字符串转换为对应类型的对象
  527. /// </summary>
  528. /// <param name="str">字符串</param>
  529. /// <returns></returns>
  530. public static object ToTypeObject(this string? str, out Type type)
  531. {
  532. if (string.IsNullOrEmpty(str) || str.EqualsIgnoreCase("null"))
  533. {
  534. type = typeof(string);
  535. return string.Empty;
  536. }
  537. else if (str.IsInt(out int objInt))
  538. {
  539. type = typeof(int);
  540. return objInt;
  541. }
  542. else if (str.IsLong(out long objLong))
  543. {
  544. type = typeof(long);
  545. return objLong;
  546. }
  547. else if (Guid.TryParse(str, out Guid objGuid))
  548. {
  549. type = typeof(Guid);
  550. return objGuid;
  551. }
  552. else if (str.IsFloat(out float objFloat))
  553. {
  554. type = typeof(float);
  555. return objFloat;
  556. }
  557. else if (str.IsDouble(out double objDouble))
  558. {
  559. type = typeof(double);
  560. return objDouble;
  561. }
  562. else if (str.IsDecimal(out decimal objDecimal))
  563. {
  564. type = typeof(decimal);
  565. return objDecimal;
  566. }
  567. else if (str.IsDateTime(out DateTime objDateTime))
  568. {
  569. type = typeof(DateTime);
  570. return objDateTime;
  571. }
  572. else if ("true".EqualsIgnoreCase(str) || "false".EqualsIgnoreCase(str))
  573. {
  574. type = typeof(bool);
  575. return "true".EqualsIgnoreCase(str);
  576. }
  577. type = typeof(string);
  578. return str;
  579. }
  580. /// <summary>
  581. /// url编码
  582. /// </summary>
  583. /// <param name="str">要编码的url</param>
  584. /// <returns></returns>
  585. public static string UrlEncode(this string? url)
  586. {
  587. return string.IsNullOrWhiteSpace(url) ? string.Empty : Uri.EscapeDataString(url).Replace("'", "%27");
  588. }
  589. /// <summary>
  590. /// url解码
  591. /// </summary>
  592. /// <param name="str">要解码的url</param>
  593. /// <returns></returns>
  594. public static string UrlDecode(this string? url)
  595. {
  596. return string.IsNullOrWhiteSpace(url) ? string.Empty : Uri.UnescapeDataString(url).Replace("%27", "'");
  597. }
  598. }
  599. }