using System.Collections; using System.Globalization; using System.Text.RegularExpressions; namespace JNPF.Common.Extension; /// /// 转换扩展类. /// public static partial class Extensions { #region 转换为long /// /// 将object转换为long,若转换失败,则返回0.不抛出异常. /// /// /// public static long ParseToLong(this object obj) { try { return long.Parse(obj.ToString() ?? string.Empty); } catch { return 0L; } } /// /// 将object转换为long,若转换失败,则返回指定值.不抛出异常. /// /// /// /// public static long ParseToLong(this string str, long defaultValue) { try { return long.Parse(str); } catch { return defaultValue; } } #endregion #region 转换为int /// /// 将object转换为int,若转换失败,则返回0。不抛出异常. /// /// /// public static int ParseToInt(this object str) { try { return Convert.ToInt32(str); } catch { return 0; } } /// /// 将object转换为int,若转换失败,则返回指定值。不抛出异常 /// null返回默认值. /// /// /// /// public static int ParseToInt(this object str, int defaultValue) { if (str == null) { return defaultValue; } try { return Convert.ToInt32(str); } catch { return defaultValue; } } #endregion #region 转换为short /// /// 将object转换为short,若转换失败,则返回0。不抛出异常. /// /// /// public static short ParseToShort(this object obj) { try { return short.Parse(obj.ToString() ?? string.Empty); } catch { return 0; } } /// /// 将object转换为short,若转换失败,则返回指定值。不抛出异常. /// /// /// /// public static short ParseToShort(this object str, short defaultValue) { try { return short.Parse(str.ToString() ?? string.Empty); } catch { return defaultValue; } } #endregion #region 转换为demical /// /// 将object转换为demical,若转换失败,则返回指定值。不抛出异常. /// /// /// /// public static decimal ParseToDecimal(this object str, decimal defaultValue) { try { return decimal.Parse(str.ToString() ?? string.Empty); } catch { return defaultValue; } } /// /// 将object转换为demical,若转换失败,则返回0。不抛出异常. /// /// /// public static decimal ParseToDecimal(this object str) { try { return decimal.Parse(str.ToString() ?? string.Empty); } catch { return 0; } } #endregion #region 转化为bool /// /// 将object转换为bool,若转换失败,则返回false。不抛出异常. /// /// /// public static bool ParseToBool(this object str) { try { if (str == null) return false; bool? value = GetBool(str); if (value != null) return value.Value; bool result; return bool.TryParse(str.ToString(), out result) && result; } catch { return false; } } /// /// 将object转换为bool,若转换失败,则返回指定值。不抛出异常. /// /// /// /// public static bool ParseToBool(this object str, bool result) { try { return bool.Parse(str.ToString() ?? string.Empty); } catch { return result; } } /// /// 获取布尔值. /// private static bool? GetBool(this object data) { switch (data.ToString()?.Trim().ToLower()) { case "0": return false; case "1": return true; case "是": return true; case "否": return false; case "yes": return true; case "no": return false; default: return null; } } #endregion #region 转换为float /// /// 将object转换为float,若转换失败,则返回0。不抛出异常. /// /// /// public static float ParseToFloat(this object str) { try { return float.Parse(str.ToString() ?? string.Empty); } catch { return 0; } } /// /// 将object转换为float,若转换失败,则返回指定值。不抛出异常. /// /// /// /// public static float ParseToFloat(this object str, float result) { try { return float.Parse(str.ToString() ?? string.Empty); } catch { return result; } } #endregion #region 转换为Guid /// /// 将string转换为Guid,若转换失败,则返回Guid.Empty。不抛出异常. /// /// /// public static Guid ParseToGuid(this string str) { try { return new Guid(str); } catch { return Guid.Empty; } } #endregion #region 转换为DateTime /// /// 将string转换为DateTime,若转换失败,则返回日期最小值。不抛出异常. /// /// /// public static DateTime ParseToDateTime(this string str) { try { if (string.IsNullOrWhiteSpace(str)) { return DateTime.MinValue; } if (str.Contains("-") || str.Contains("/")) { return DateTime.Parse(str); } int length = str.Length; return length switch { 4 => DateTime.ParseExact(str, "yyyy", CultureInfo.CurrentCulture), 6 => DateTime.ParseExact(str, "yyyyMM", CultureInfo.CurrentCulture), 8 => DateTime.ParseExact(str, "yyyyMMdd", CultureInfo.CurrentCulture), 10 => DateTime.ParseExact(str, "yyyyMMddHH", CultureInfo.CurrentCulture), 12 => DateTime.ParseExact(str, "yyyyMMddHHmm", CultureInfo.CurrentCulture), // ReSharper disable once StringLiteralTypo 14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", CultureInfo.CurrentCulture), // ReSharper disable once StringLiteralTypo _ => DateTime.ParseExact(str, "yyyyMMddHHmmss", CultureInfo.CurrentCulture) }; } catch { return DateTime.MinValue; } } /// /// 将时间戳转为DateTime. /// /// 时间戳. /// public static DateTime TimeStampToDateTime(this long timeStamp) { try { DateTimeOffset dto = DateTimeOffset.FromUnixTimeMilliseconds(timeStamp); return dto.ToLocalTime().DateTime; } catch (Exception) { throw; } } /// /// 将时间戳转为DateTime. /// /// 时间戳. /// public static DateTime TimeStampToDateTime(this string timeStamp) { try { DateTimeOffset dto = DateTimeOffset.FromUnixTimeMilliseconds(Convert.ToInt64(timeStamp)); return dto.ToLocalTime().DateTime; } catch (Exception) { throw; } } /// /// 将 DateTime? 转换为 DateTime. /// /// /// public static DateTime ParseToDateTime(this DateTime? date) { return Convert.ToDateTime(date); } /// /// 将 DateTime 根据指定格式转换. /// /// 时间. /// 格式字符串. /// public static DateTime ParseToDateTime(this DateTime? date, string format) { return Convert.ToDateTime(string.Format("{0:" + format + "}", date)); } /// /// 将 DateTime 根据指定格式转换. /// /// 时间. /// 格式字符串. /// public static DateTime ParseToDateTime(this DateTime date, string format) { return Convert.ToDateTime(string.Format("{0:" + format + "}", date)); } /// /// 将string转换为DateTime,若转换失败,则返回默认值. /// /// /// /// public static DateTime ParseToDateTime(this string str, DateTime? defaultValue) { try { if (string.IsNullOrWhiteSpace(str)) { return defaultValue.GetValueOrDefault(); } if (str.Contains("-") || str.Contains("/")) { return DateTime.Parse(str); } int length = str.Length; return length switch { 4 => DateTime.ParseExact(str, "yyyy", CultureInfo.CurrentCulture), 6 => DateTime.ParseExact(str, "yyyyMM", CultureInfo.CurrentCulture), 8 => DateTime.ParseExact(str, "yyyyMMdd", CultureInfo.CurrentCulture), 10 => DateTime.ParseExact(str, "yyyyMMddHH", CultureInfo.CurrentCulture), 12 => DateTime.ParseExact(str, "yyyyMMddHHmm", CultureInfo.CurrentCulture), // ReSharper disable once StringLiteralTypo 14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", CultureInfo.CurrentCulture), // ReSharper disable once StringLiteralTypo _ => DateTime.ParseExact(str, "yyyyMMddHHmmss", CultureInfo.CurrentCulture) }; } catch { return defaultValue.GetValueOrDefault(); } } #endregion #region 转换为string /// /// 将object转换为string,若转换失败,则返回""。不抛出异常. /// /// /// public static string ParseToString(this object obj) { try { return obj == null ? string.Empty : obj.ToString()!; } catch { return string.Empty; } } /// /// 将object转换为string. /// /// /// /// public static string ParseToStrings(this object obj) { try { if (obj is IEnumerable list) { return string.Join(",", list); } return obj.ToString()!; } catch { return string.Empty; } } #endregion #region 转换为double /// /// 将object转换为double,若转换失败,则返回0。不抛出异常. /// /// /// public static double ParseToDouble(this object obj) { try { return double.Parse(obj.ToString() ?? string.Empty); } catch { return 0; } } /// /// 将object转换为double,若转换失败,则返回指定值。不抛出异常. /// /// /// /// public static double ParseToDouble(this object str, double defaultValue) { try { return double.Parse(str.ToString() ?? string.Empty); } catch { return defaultValue; } } #endregion #region 强制转换类型 /// /// 强制转换类型. /// /// /// /// public static IEnumerable CastSuper(this IEnumerable source) { return from object item in source select (TResult)Convert.ChangeType(item, typeof(TResult)); } #endregion #region 转换为ToUnixTime public static long ParseToUnixTime(this DateTime nowTime) { DateTimeOffset dto = new DateTimeOffset(nowTime); return dto.ToUnixTimeMilliseconds(); } #endregion #region 转换为帕斯卡命名法 /// /// 将字符串转为帕斯卡命名法. /// /// 源字符串. /// public static string ParseToPascalCase(this string original) { Regex invalidCharsRgx = new Regex("[^_a-zA-Z0-9]"); Regex whiteSpace = new Regex(@"(?<=\s)"); Regex startsWithLowerCaseChar = new Regex("^[a-z]"); Regex firstCharFollowedByUpperCasesOnly = new Regex("(?<=[A-Z])[A-Z0-9]+$"); Regex lowerCaseNextToNumber = new Regex("(?<=[0-9])[a-z]"); Regex upperCaseInside = new Regex("(?<=[A-Z])[A-Z]+?((?=[A-Z][a-z])|(?=[0-9]))"); // 用undescore替换空白,然后用空字符串替换所有无效字符 var pascalCase = invalidCharsRgx.Replace(whiteSpace.Replace(original, "_"), string.Empty) // 用下划线分割 .Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries) // 首字母设置为大写 .Select(w => startsWithLowerCaseChar.Replace(w, m => m.Value.ToUpper())) // 如果没有下一个小写字母(ABC -> Abc),则将第二个及所有后面的大写字母替换为小写字母 .Select(w => firstCharFollowedByUpperCasesOnly.Replace(w, m => m.Value.ToLower())) // 数字后面的第一个小写字母 设置大写(Ab9cd -> Ab9Cd) .Select(w => lowerCaseNextToNumber.Replace(w, m => m.Value.ToUpper())) // 第二个小写字母和下一个大写字母,除非最后一个字母后跟任何小写字母 (ABcDEf -> AbcDef) .Select(w => upperCaseInside.Replace(w, m => m.Value.ToLower())); return string.Concat(pascalCase); } #endregion #region IsEmpty /// /// 是否为空. /// /// 值. public static bool IsEmpty(this string? value) { return string.IsNullOrWhiteSpace(value); } /// /// 是否为空. /// /// 值. public static bool IsEmpty(this Guid? value) { if (value == null) return true; return IsEmpty(value.Value); } /// /// 是否为空. /// /// 值. public static bool IsEmpty(this Guid value) { if (value == Guid.Empty) return true; return false; } /// /// 是否为空. /// /// 值. public static bool IsEmpty(this object value) { if (value != null && !string.IsNullOrEmpty(value.ToString())) { return false; } else { return true; } } /// /// 判断是否为Null或者空. /// /// 对象. /// public static bool IsNullOrEmpty(this object obj) { if (obj == null) return true; else { string objStr = obj.ToString(); return string.IsNullOrEmpty(objStr); } } #endregion #region IsNotEmptyOrNull /// /// 不为空. /// /// /// public static string ObjToString(this object thisValue) { if (thisValue != null) return thisValue.ToString()!.Trim(); return string.Empty; } /// /// 不为空. /// /// /// public static bool IsNotEmptyOrNull(this object thisValue) { return ObjToString(thisValue) != string.Empty && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null"; } /// /// 是否为空 /// added by ly on 20230703 /// /// /// public static bool IsNull(this object thisValue) { return thisValue == null; } #endregion #region List /// /// 嵌套List解析 /// 仅限于列表查询条件多选. /// /// /// public static List ParseToNestedList(this List> list) { List result = new List(); if (list != null && list.Count > 0) { foreach (var item in list) result.Add(item.Last()); } return result; } #endregion }