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;
}
}
}
}