public static class Expand {
#region string Is
public static bool IsEmpty(this string s) {
return string.IsNullOrWhiteSpace(s);
}
public static bool IsNumber(this string s) {
if (s == null || s.Trim().Length == 0) return false;
if (!char.IsNumber(s[0]) && s[0] != '-') return false;
for (var i = 1; i < s.Length; i++) if (!char.IsNumber(s[i])) return false;
return true;
}
public static bool IsEmail(this string s) {
var pattern = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
var regex = new Regex(pattern);
return regex.IsMatch(s);
}
public static bool IsMobilePhone(this string s) {
var regex = new Regex("^1[34578]\\d{9}$");
return regex.IsMatch(s);
}
public static bool IsDevice(this string s) {
var result = false;
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PNPEntity")) {
foreach (var mgt in searcher.Get()) {
if (mgt["name"].ToString().IndexOf(s, StringComparison.Ordinal) <= -1) continue;
result = true; mgt.Dispose(); break;
}
return result;
}
}
#endregion
#region string
public static int ToInt(this object o, int def = 0) {
if (o == null || o is DBNull) return def;
if (o.ToString().Trim() == "") return def;
//string s = o.ToString().Trim().Match(@"-?\d+");
int r = def;
if (!int.TryParse(o.ToString(), out r)) o.ToString();
return r;
}
public static string Replace(this string s, string p, string r) {
return Regex.Replace(s, p, r);
}
public static string ToBinary(this string s) {
var data = Encoding.Unicode.GetBytes(s);
var result = new StringBuilder(data.Length * 8);
foreach (var b in data) {
result.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
}
return result.ToString();
}
public static string Hash(this string s) {
return string.Join("", MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(s)).Select(v => v.ToString("x2")));
}
public static string ToHexReverse(this string s) {
if (s.Length % 2 > 0) return s;
var arr = s.ToCharArray();
var r = new char[arr.Length];
for (var i = 0; i < arr.Length; i += 2) {
r[i] = arr[arr.Length - i - 2];
r[i + 1] = arr[arr.Length - i - 1];
}
return new string(r);
}
/// <summary>
/// 16进制字符串转字节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static byte[] ToBytes(this string s) {
s = Replace(s, @"[^\dA-Fa-f]+", "");
if (s.Length % 2 > 0) s = "0" + s;
var max = s.Length / 2;
var buf = new byte[max];
for (var i = 0; i < max; i++) buf[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
return buf;
}
#endregion
#region DateTime
public static long Totimestamp(this DateTime date) {
var ticks = date.ToUniversalTime().Ticks - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
var timeSpan = ticks / TimeSpan.TicksPerMillisecond;
return timeSpan;
}
public static DateTime Todatetime(this long timespan) {
var startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
var dt = timespan.ToString().Length == 13 ? startTime.AddMilliseconds(timespan) : startTime.AddSeconds(timespan);
return dt;
}
#endregion
#region byte[]
public static byte[] ToAsciiStr(this string s) { return Encoding.ASCII.GetBytes(s); }
public static string ToHexStr(this byte[] b) {
if (b == null) return "";
var s = string.Join(" ", b.Select(i => i.ToString("X2")));
return s;
//return BitConverter.ToString(b, 0, b.Length);
}
public static ulong Getbal(this byte[] result, int ruleBal, int idx = 17, int len = 4) {
switch (ruleBal) {
case 0: //BCD
var s = BitConverter.ToString(result, idx, len).Replace("-", "").ToLower();
return s.IsNumber() ? s.ToULong() : ulong.MaxValue;
case 1: // HEX 低前,反序(小端模式)
case 2: // HEX 高前,顺序
ulong b = 0;
switch (ruleBal) {
case 1:
idx += len - 1;
b = result[idx];
for (var i = 1; i < len; i++) {
b = (b << 8) + result[idx - i];
}
break;
case 2:
b = result[idx];
for (var i = 1; i < len; i++) {
b = (b << 8) + result[idx + i];
}
break;
}
return b;
}
return 0;
}
public static byte[] Remove(this byte[] b, byte cut = 0x00) {
var list = new List<byte>();
list.AddRange(b);
for (var i = list.Count - 1; i >= 0; i--) {
if (list[i] == cut) { list.RemoveAt(i); } else { break; }
}
var lastbyte = new byte[list.Count];
for (var i = 0; i < list.Count; i++) {
lastbyte[i] = list[i];
}
return lastbyte;
}
public static double ToDouble(this object o, long def = 0) {
if (o == null || o is DBNull) return def;
return double.Parse(o.ToString());
}
public static ulong ToULong(this object o, ulong def = 0) {
if (o == null || o is DBNull) return def;
var str = o.ToString().Trim().ToLower();
int i;
if (str.IndexOf("e-", StringComparison.Ordinal) > 0) return def;
if (str.IndexOf("e+", StringComparison.Ordinal) > 0) {
i = str.IndexOf("e+", StringComparison.Ordinal);
var a = ulong.Parse(str.Substring(0, i));
i += 2;
return a * ulong.Parse(str.Substring(i, str.Length - i));
}
i = str.IndexOf('.');
if (i > -1) return ulong.Parse(str.Substring(0, i));
return str.IsEmpty() ? def : ulong.Parse(str);
}
public static string Joins(this IEnumerable<string> values, string separator) {
return string.Join(separator, values);
}
#endregion
#region json
public static string XmlTojson(this string s, string r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>") {
s = s.Replace(r, "");
var doc = new XmlDocument();
doc.LoadXml(s);
return JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
}
public static string JsonToxml(this string s, string r = "root") {
var doc = JsonConvert.DeserializeXmlNode(s, r);
using (var stream = new MemoryStream()) {
var writer = new XmlTextWriter(stream, null) { Formatting = System.Xml.Formatting.Indented };
doc.Save(writer);
using (var sr = new StreamReader(stream, Encoding.UTF8)) {
stream.Position = 0;
return sr.ReadToEnd();
}
;
}
}
public static string Json(this object o) {
return new JavaScriptSerializer().Serialize(o);
}
public static object JsonParse(this string s) {
return s.Trim().IsEmpty() ? new object() : new JavaScriptSerializer().Deserialize<object>(s);
}
public static bool IsJson(this string s) { try { JsonParse(s); return true; } catch { return false; } }
#endregion
#region match
public static string match(this string s, string p, int i = 0) {
if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(p)) return string.Empty;
var match = Regex.Match(s, p);
if (i < match.Groups.Count) return match.Groups[i].Value;
i = 0;
return match.Groups[i].Value;
}
public static string get(this string s, string name) { return match(s, "\"" + name + @""":""([^""]+)", 1); }
public static string getmoney(this string s, string name) { return match(s, "\"" + name + @""":""?([\-\d\.]+)", 1); }
public static string GetTitle(this string s, string title) {
var tmpStr = $"<{title}[^>]*?>(?<Text>[^<]*)</{title}>"; //获取<title>之间内容
var titleMatch = Regex.Match(s, tmpStr, RegexOptions.IgnoreCase);
var result = titleMatch.Groups["Text"].Value;
return result;
}
public static string MathRound(this string s) {
return Math.Round(decimal.Parse(s)).ToString(CultureInfo.InvariantCulture);
}
public static string MathCeiling(this string s) {
return Math.Ceiling(decimal.Parse(s)).ToString(CultureInfo.InvariantCulture);
}
public static string MathFloor(this string s) {
return Math.Floor(decimal.Parse(s)).ToString(CultureInfo.InvariantCulture);
}
#endregion
#region Dictionary
public static TValue DicGet<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default(TValue)) {
if (key == null) return defaultValue;
return dict.ContainsKey(key) ? dict[key] : defaultValue;
}
#endregion
#region ToMoney
public static string ToMoney(this uint m) { return (m * .01).ToString("0.00"); }
public static string ToMoney(this ulong m, string prefix = "") {
return prefix + (m * .01).ToString("0.00");
}
public static string ToMoney(this long m, string prefix = "") {
return prefix + (m * .01).ToString("0.00");
}
public static string ToMoney(this int m) {
return (m * .01).ToString("0.00");
}
public static long ToMoney(this object o, double q = 100) {
if (o == null) return 0;
double x = 0;
if (!double.TryParse(o.ToString(), out x)) throw new ArgumentException("ToMoney: " + o);
return Convert.ToInt64(x * q);
}
#endregion
}