using System; using UnityEngine; namespace ET.PackageManager.Editor { /// /// 处理字符串转换的类 /// public static class StrConv { #region 数组分隔符 public const string ArrSplitLv1 = "|"; public const string ArrSplitLv2 = "*"; public const string ArrSplitLv3 = "$"; public const string ArrSplitLv4 = "#"; public const char ChrArrSplitLv1 = '|'; public const char ChrArrSplitLv2 = '*'; public const char ChrArrSplitLv3 = '$'; public const char ChrArrSplitLv4 = '#'; #endregion 数组分隔符 /// /// 从字符串转值到u16 /// /// /// /// public static bool ToU16(string valueIn, out ushort valueOut) { if (string.IsNullOrEmpty(valueIn)) { valueOut = 0; return false; } bool success = ushort.TryParse(valueIn, out valueOut); if (!success) { Debug.LogError("UInt16.TryParse error"); valueOut = 0; return false; } return true; } /// /// 从字符串转值到u32 /// /// /// /// public static bool ToU32(string valueIn, out uint valueOut) { if (string.IsNullOrEmpty(valueIn)) { valueOut = 0; return false; } bool success = uint.TryParse(valueIn, out valueOut); if (!success) { Debug.LogError("UInt32.TryParse error"); valueOut = 0; return false; } return true; } /// /// 从字符串转值到u32,直接返回值 /// /// /// public static uint ToU32(string value) { uint.TryParse(value, out uint newValue); return newValue; } /// /// 从字符串转值到u64,直接返回值 /// /// /// public static ulong ToU64(string value) { ulong.TryParse(value, out ulong newValue); return newValue; } /// /// 从字符串转值到i32 /// /// /// /// public static bool ToI32(string valueIn, out int valueOut) { if (string.IsNullOrEmpty(valueIn)) { valueOut = 0; return false; } bool success = Int32.TryParse(valueIn, out valueOut); if (!success) { Debug.LogError("UInt32.TryParse error"); valueOut = 0; return false; } return true; } /// /// 从字符串转值到i32, 直接返回值 /// /// /// public static int ToI32(string value) { Int32.TryParse(value, out int newValue); return newValue; } /// /// 从字符串转值到float /// /// /// /// 默认值为1 /// public static bool ToFloat(string valueIn, out float valueOut, float per) { if (string.IsNullOrEmpty(valueIn)) { valueOut = 0; return false; } bool success = float.TryParse(valueIn, out valueOut); if (!success) { Debug.LogError("float.TryParse error"); valueOut = 0; return false; } valueOut = valueOut * per; return true; } /// /// 解析千分比 /// /// /// public static float ToPer1000(string value) { uint v2 = ToU32(value); return v2 * 0.001f; } /// /// 从字符串转值到Byte /// /// /// /// public static bool ToByte(string valueIn, out byte valueOut) { if (string.IsNullOrEmpty(valueIn)) { valueOut = 0; return false; } bool success = byte.TryParse(valueIn, out valueOut); if (!success) { Debug.LogError("Byte.TryParse error"); valueOut = 0; return false; } return true; } /// /// 将文本转为数值 /// /// /// /// /// public static T ToNumber(string input, T defValue = default) { return ToNumber(input, out T value) ? value : defValue; } /// /// 通用的将文本转为数值 /// /// /// /// /// public static bool ToNumber(string input, out T output) { try { object t; switch (typeof(T).GetNumericType()) { case NumericType.Int32: int.TryParse(input, out var valueInt32); t = valueInt32; break; case NumericType.UInt32: uint.TryParse(input, out var valueUInt32); t = valueUInt32; break; case NumericType.Float: float.TryParse(input, out var valueFloat); t = valueFloat; break; case NumericType.Int16: Int16.TryParse(input, out var valueInt16); t = valueInt16; break; case NumericType.Int64: Int64.TryParse(input, out var valueInt64); t = valueInt64; break; case NumericType.UInt16: UInt16.TryParse(input, out var valueUInt16); t = valueUInt16; break; case NumericType.UInt64: UInt64.TryParse(input, out var valueUInt64); t = valueUInt64; break; case NumericType.Byte: byte.TryParse(input, out var valueByte); t = valueByte; break; case NumericType.SByte: sbyte.TryParse(input, out var valueSByte); t = valueSByte; break; case NumericType.Double: double.TryParse(input, out var valueDouble); t = valueDouble; break; case NumericType.Decimal: decimal.TryParse(input, out var valueDecimal); t = valueDecimal; break; default: output = default; return false; } output = (T)t; return true; } catch (Exception) { output = default; return false; } } /// /// 从字符串转值到enum /// /// /// /// /// public static bool ToEnum(string valueIn, out TEnum valueOut) { valueOut = (TEnum)Enum.Parse(typeof(TEnum), valueIn); return true; } /// /// 从字符串转值到enum /// /// /// /// public static TEnum ToEnum(string value) { return (TEnum)Enum.Parse(typeof(TEnum), value); } /// /// 通过一定规则,把字符串转为数组 /// /// /// /// /// /// 解析器 /// public static bool ToArr(string valueIn, string separator, out T[] valueOut, Func parse) { if (string.IsNullOrEmpty(valueIn)) { valueOut = new T[0]; return true; } string[] strValueArr = valueIn.Split(new[] { separator }, StringSplitOptions.None); Type tType = typeof(T); if (typeof(string) == tType) { valueOut = strValueArr as T[]; return true; } if (parse == null) { throw new NullReferenceException("如果项非string类型,则必需设置解析器"); } valueOut = new T[strValueArr.Length]; for (int i = 0; i < strValueArr.Length; i++) { valueOut[i] = parse(strValueArr[i]); } return true; } /// /// 通过一定规则,把字答串数组转为对应类型数组 /// /// /// /// /// public static T[] ToArr(string[] values, Func parse) { T[] valueOut = new T[values.Length]; for (int i = 0; i < values.Length; i++) { valueOut[i] = parse(values[i]); } return valueOut; } public static T[] ToArr(string value, string separator = ArrSplitLv1) { if (ToArr(value, separator, out T[] item, ParseAny)) { return item; } return new T[0]; } /// /// 主要用在ParseArr /// 支持string, enum, number的解析 /// /// /// /// public static T ParseAny(string value) { Type tType = typeof(T); if (tType.IsEnum) { return ToEnum(value); } if (tType == typeof(string)) { return (T)(object)value; } if (!double.TryParse(value, out double doubleValue)) { return default; } if (typeof(T) == typeof(double)) { return (T)(object)doubleValue; } try { object o = Convert.ChangeType(doubleValue, typeof(T)); return (T)o; } catch (Exception e) { Debug.LogError($"Error:{e.Message}{e.StackTrace}"); return default; } } } }