using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Stary.Evo { #if UNITY_EDITOR [ClassAPI("01.FluentAPI.CSharp", "System.String", 1)] [APIDescriptionCN("针对 System.String 提供的链式扩展,理论上任何集合都可以使用")] [APIDescriptionEN("The chain extension provided by System.Collections can theoretically be used by any collection")] #endif public static class SystemStringExtension { #if UNITY_EDITOR // v1 No.18 [MethodAPI] [APIDescriptionCN("检测是否为空或 Empty")] [APIDescriptionEN("Check Whether string is null or empty")] [APIExampleCode(@" Debug.Log(string.Empty.IsNullOrEmpty()); // true ")] #endif public static bool IsNullOrEmpty(this string selfStr) { return string.IsNullOrEmpty(selfStr); } #if UNITY_EDITOR // v1 No.19 [MethodAPI] [APIDescriptionCN("检测是否为非空且非Empty")] [APIDescriptionEN("Checks both not null and non-empty")] [APIExampleCode(@" Debug.Log(""Hello"".IsNotNullAndEmpty()); // true ")] #endif public static bool IsNotNullAndEmpty(this string selfStr) { return !string.IsNullOrEmpty(selfStr); } #if UNITY_EDITOR // v1 No.20 [MethodAPI] [APIDescriptionCN("去掉两端空格后,检测是否为空或 Empty")] [APIDescriptionEN("Check if it is Empty or Empty after removing whitespace from both sides")] [APIExampleCode(@" Debug.Log("" "".IsTrimNullOrEmpty()); // true ")] #endif public static bool IsTrimNullOrEmpty(this string selfStr) { return selfStr == null || string.IsNullOrEmpty(selfStr.Trim()); } /// /// Check Whether string trim is null or empty /// /// /// #if UNITY_EDITOR // v1 No.21 [MethodAPI] [APIDescriptionCN("去掉两端空格后,检测是否为非 null 且非 Empty")] [APIDescriptionEN("After removing whitespace from both sides, check whether it is non-null and non-empty")] [APIExampleCode(@" Debug.Log("" 123 "".IsTrimNotNullAndEmpty()); // true ")] #endif public static bool IsTrimNotNullAndEmpty(this string selfStr) { return selfStr != null && !string.IsNullOrEmpty(selfStr.Trim()); } /// /// 缓存 /// private static readonly char[] mCachedSplitCharArray = { '.' }; #if UNITY_EDITOR // v1 No.22 [MethodAPI] [APIDescriptionCN("字符串分割")] [APIDescriptionEN("String splitting")] [APIExampleCode(@" ""1.2.3.4.5"".Split('.').ForEach(str=>Debug.Log(str)); // 1 2 3 4 5 ")] #endif public static string[] Split(this string selfStr, char splitSymbol) { mCachedSplitCharArray[0] = splitSymbol; return selfStr.Split(mCachedSplitCharArray); } #if UNITY_EDITOR // v1 No.23 [MethodAPI] [APIDescriptionCN("格式化字符串填充参数")] [APIDescriptionEN("The format string populates the parameters")] [APIExampleCode(@" var newStr = ""{0},{1}"".FillFormat(1,2); Debug.Log(newStr); // 1,2 ")] #endif public static string FillFormat(this string selfStr, params object[] args) { return string.Format(selfStr, args); } #if UNITY_EDITOR // v1 No.24 [MethodAPI] [APIDescriptionCN("返回包含此字符串的 StringBuilder")] [APIDescriptionEN("Returns a StringBuilder containing this string")] [APIExampleCode(@" var builder = ""Hello"".Builder(); builder.Append("" QF""); Debug.Log(builder.ToString()); // Hello QF ")] #endif public static StringBuilder Builder(this string selfStr) { return new StringBuilder(selfStr); } #if UNITY_EDITOR // v1 No.25 [MethodAPI] [APIDescriptionCN("StringBuilder 添加前缀")] [APIDescriptionEN("StringBuilder insert prefix string")] [APIExampleCode(@" var builder = ""I'm liangxie"".Builder().AddPrefix(""Hi!"") ; Debug.Log(builder.ToString()); // Hi!I'm liangxie ")] #endif public static StringBuilder AddPrefix(this StringBuilder self, string prefixString) { self.Insert(0, prefixString); return self; } #if UNITY_EDITOR // v1 No.26 [MethodAPI] [APIDescriptionCN("字符串解析成 Int")] [APIDescriptionEN("parse string to int")] [APIExampleCode(@" var number = ""123456"".ToInt(); Debug.Log(number); // 123456 // notice unsafe // 不安全 ")] #endif public static int ToInt(this string selfStr, int defaulValue = 0) { var retValue = defaulValue; return int.TryParse(selfStr, out retValue) ? retValue : defaulValue; } public static long ToLong(this string self, long defaultValue = 0) { var retValue = defaultValue; return long.TryParse(self, out retValue) ? retValue : defaultValue; } #if UNITY_EDITOR // v1 No.27 [MethodAPI] [APIDescriptionCN("字符串解析成 Int")] [APIDescriptionEN("parse string to int")] [APIExampleCode(@" DateTime.Now.ToString().ToDataTime(); ")] #endif public static DateTime ToDateTime(this string selfStr, DateTime defaultValue = default(DateTime)) { return DateTime.TryParse(selfStr, out var retValue) ? retValue : defaultValue; } #if UNITY_EDITOR // v1 No.28 [MethodAPI] [APIDescriptionCN("字符串解析成 float")] [APIDescriptionEN("parse string to float")] [APIExampleCode(@" var number = ""123456f"".ToInt(); Debug.Log(number); // 123456 // notice unsafe // 不安全 ")] #endif public static float ToFloat(this string selfStr, float defaultValue = 0) { return float.TryParse(selfStr, out var retValue) ? retValue : defaultValue; } #if UNITY_EDITOR // v1 No.29 [MethodAPI] [APIDescriptionCN("是否存在中文字符")] [APIDescriptionEN("check string contains chinese or not")] [APIExampleCode(@" Debug.Log(""你好"".HasChinese()); // true ")] #endif public static bool HasChinese(this string input) { return Regex.IsMatch(input, @"[\u4e00-\u9fa5]"); } #if UNITY_EDITOR // v1 No.30 [MethodAPI] [APIDescriptionCN("是否存在空格")] [APIDescriptionEN("check string contains space or not")] [APIExampleCode(@" Debug.Log(""你好 "".HasSpace()); // true ")] #endif public static bool HasSpace(this string input) { return input.Contains(" "); } #if UNITY_EDITOR // v1 No.31 [MethodAPI] [APIDescriptionCN("remove string")] [APIDescriptionEN("check string contains space or not")] [APIExampleCode(@" Debug.Log(""Hello World "".RemoveString(""Hello"","" "")); // World ")] #endif public static string RemoveString(this string str, params string[] targets) { return targets.Aggregate(str, (current, t) => current.Replace(t, string.Empty)); } #if UNITY_EDITOR // v1.0.39 [MethodAPI] [APIDescriptionCN("join string")] [APIDescriptionEN("join string")] [APIExampleCode(@" Debug.Log(new List() { ""1"",""2"",""3""}.StringJoin("","")); // 1,2,3 ")] #endif public static string StringJoin(this IEnumerable self, string separator) { return string.Join(separator, self); } } }