SunnyUI/SunnyUI/Static/UString.cs

1274 lines
44 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
* CopyRight (C) 2012-2020 ShenYongHua(沈永华).
* QQ群56829229 QQ17612584 EMailSunnyUI@qq.com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 如果您使用此代码,请保留此说明。
******************************************************************************
* 文件名称: UString.cs
* 文件说明: 字符串扩展类
* 当前版本: V2.2
* 创建日期: 2020-01-01
*
* 2020-01-01: V2.2.0 增加文件说明
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace Sunny.UI
{
/// <summary>
/// 字符串扩展类
/// </summary>
public static class StringEx
{
/// <summary>
/// 处理文件夹名称末尾加文件夹分隔符(windows为\linux为/)
/// </summary>
/// <param name="dir">文件夹名称</param>
/// <returns>结果</returns>
public static string DealPath(this string dir)
{
return dir.IsNullOrEmpty() ? dir : (dir[dir.Length - 1] == Path.DirectorySeparatorChar ? dir : dir + Path.DirectorySeparatorChar);
}
/// <summary>
/// 默认加密密码
/// </summary>
public const string DefaultCryptString = "!@#$%^&*";
/// <summary>
/// 浮点数的格式化字符串例如0.00
/// </summary>
/// <param name="decimalcount">小数位数</param>
/// <returns>字符串</returns>
public static string FormatString(this int decimalcount)
{
if (decimalcount <= 0)
{
return "0";
}
return "0." + "0".Repet(decimalcount);
}
/// <summary>忽略大小写的字符串相等比较,判断是否以任意一个待比较字符串相等</summary>
/// <param name="value">字符串</param>
/// <param name="strs">待比较字符串数组</param>
/// <returns>相等比较</returns>
public static bool EqualsIgnoreCase(this string value, params string[] strs)
{
foreach (var item in strs)
{
if (string.Equals(value, item, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
/// <summary>忽略大小写的字符串相等比较,判断是否以任意一个待比较字符串相等</summary>
/// <param name="value">字符串</param>
/// <param name="comparestring">待比较字符串</param>
/// <returns>相等比较</returns>
public static bool EqualsIgnoreCase(this string value, string comparestring)
{
return string.Equals(value, comparestring, StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static bool ToBoolean(this string s, bool def = default(bool))
{
return bool.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static char ToChar(this string s, char def = default(char))
{
return char.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static decimal ToDecimal(this string s, decimal def = default(decimal))
{
return decimal.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static double ToDouble(this string s, double def = default(double))
{
return double.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static float ToFloat(this string s, float def = default(float))
{
return float.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static byte ToByte(this string s, byte def = default(byte))
{
return byte.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static sbyte ToSByte(this string s, sbyte def = default(sbyte))
{
return sbyte.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static short ToShort(this string s, short def = default(short))
{
return short.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static ushort ToUShort(this string s, ushort def = default(ushort))
{
return ushort.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static int ToInt(this string s, int def = default(int))
{
return int.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static uint ToUInt(this string s, uint def = default(uint))
{
return uint.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static long ToLong(this string s, long def = default(long))
{
return long.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static ulong ToULong(this string s, ulong def = default(ulong))
{
return ulong.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static DateTime ToDateTime(this string s, DateTime def = default(DateTime))
{
return DateTime.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 字符串转换为日期
/// </summary>
/// <param name="s">字符串</param>
/// <param name="formatString">日期格式</param>
/// <returns>结果</returns>
public static DateTime ToDateTime(this string s, string formatString)
{
return DateTime.ParseExact(s, formatString, CultureInfo.InvariantCulture);
}
/// <summary>
/// 字符串转换为日期
/// </summary>
/// <param name="s">字符串</param>
/// <param name="formatString">日期格式可包含的格式化字符串为yyyy、yy、MM、dd、HH、mm、ss、fff、、-、空格</param>
/// <param name="def">默认日期</param>
/// <returns>结果</returns>
public static DateTime ToDateTimeEx(this string s, string formatString, DateTime def = default(DateTime))
{
int year = def.Year;
int month = def.Month;
int day = def.Day;
int hour = def.Hour;
int minute = def.Minute;
int second = def.Second;
int millisecond = def.Millisecond;
if (formatString.Contains("yyyy"))
year = s.Substring(formatString.IndexOf("yyyy", StringComparison.CurrentCulture), 4).ToInt();
else if (formatString.Contains("yy"))
year = 2000 + s.Substring(formatString.IndexOf("yy", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("MM"))
month = s.Substring(formatString.IndexOf("MM", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("dd"))
day = s.Substring(formatString.IndexOf("dd", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("HH"))
hour = s.Substring(formatString.IndexOf("HH", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("mm"))
minute = s.Substring(formatString.IndexOf("mm", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("ss"))
second = s.Substring(formatString.IndexOf("ss", StringComparison.CurrentCulture), 2).ToInt();
if (formatString.Contains("fff"))
millisecond = s.Substring(formatString.IndexOf("fff", StringComparison.CurrentCulture), 3).ToInt();
try
{
return new DateTime(year, month, day, hour, minute, second, millisecond);
}
catch
{
return def;
}
}
/// <summary>
/// 字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <param name="def">默认</param>
/// <returns>结果</returns>
public static Guid ToGuid(this string s, Guid def = default(Guid))
{
return Guid.TryParse(s, out var result) ? result : def;
}
/// <summary>
/// 是否是布尔字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsBoolean(this string s)
{
return bool.TryParse(s, out _);
}
/// <summary>
/// 是否是Char字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsChar(this string s)
{
return char.TryParse(s, out _);
}
/// <summary>
/// 是否是Decima字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsDecimal(this string s)
{
return decimal.TryParse(s, out decimal _);
}
/// <summary>
/// 是否是Double字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsDouble(this string s)
{
return double.TryParse(s, out _);
}
/// <summary>
/// 是否是Float字符串转换
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsFloat(this string s)
{
return float.TryParse(s, out float _);
}
/// <summary>
/// 是否是Byte字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsByte(this string s)
{
return byte.TryParse(s, out _);
}
/// <summary>
/// 是否是SByte字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsSByte(this string s)
{
return sbyte.TryParse(s, out _);
}
/// <summary>
/// 是否是Short字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsShort(this string s)
{
return short.TryParse(s, out _);
}
/// <summary>
/// 是否是UShort字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsUShort(this string s)
{
return ushort.TryParse(s, out _);
}
/// <summary>
/// 是否是Int字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsInt(this string s)
{
return int.TryParse(s, out _);
}
/// <summary>
/// 是否是UInt字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsUInt(this string s)
{
return uint.TryParse(s, out _);
}
/// <summary>
/// 是否是Long字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsLong(this string s)
{
return long.TryParse(s, out _);
}
/// <summary>
/// 是否是ULong字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsULong(this string s)
{
return ulong.TryParse(s, out _);
}
/// <summary>
/// 是否是日期字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsDateTime(this string s)
{
return DateTime.TryParse(s, out _);
}
/// <summary>
/// 是否是Guid字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsGuid(this string s)
{
return Guid.TryParse(s, out _);
}
/// <summary>
/// 结果序列化字符串
/// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
/// </summary>
public const string StructLayoutString = "[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]";
/// <summary>
/// 字符串重复显示
/// </summary>
/// <param name="str">The string.</param>
/// <param name="count">The count.</param>
/// <returns>System.String.</returns>
public static string Repet(this string str, int count)
{
if (count <= 0)
{
return string.Empty;
}
StringBuilder sb = new StringBuilder();
sb.Append("");
for (int i = 0; i < count; i++)
{
sb.Append(str);
}
return sb.ToString();
}
/// <summary>
/// 字符串左侧按长度截取后的字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="length">长度</param>
/// <returns>字符串</returns>
public static string Left(this string s, int length)
{
return s.IsNullOrEmpty() ? s : (length <= s.Length ? s.Substring(0, length) : s);
}
/// <summary>
/// 字符串中间按长度截取后的字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="start">开始</param>
/// <param name="length">长度</param>
/// <returns>字符串</returns>
public static string Middle(this string s, int start, int length)
{
return s.IsNullOrEmpty() ? s : (length <= s.Length - start ? s.Substring(start, length) : s.Substring(start, s.Length - start));
}
/// <summary>
/// 指示指定的字符串是 null还是 Empty 字符串。
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsNullOrEmpty(this string s)
{
return string.IsNullOrEmpty(s);
}
/// <summary>
/// 指示指定的字符串是 null还是 Empty 字符串。
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsValid(this string s)
{
return !string.IsNullOrEmpty(s);
}
/// <summary>
/// 截取指定长度的字符串
/// </summary>
/// <param name="value">字符串</param>
/// <param name="maxLength">长度</param>
/// <returns>结果</returns>
public static string TrimToMaxLength(this string value, int maxLength)
{
return (value == null || value.Length <= maxLength ? value : value.Substring(0, maxLength));
}
/// <summary>
/// 字符串为空时返回缺省值,不为空时直接返回原字符串
/// </summary>
/// <param name="value">value</param>
/// <param name="defaultValue">defaultValue</param>
/// <returns>结果</returns>
public static string IfEmpty(this string value, string defaultValue)
{
return (value.IsNullOrEmpty() ? defaultValue : value);
}
/// <summary>
/// 指示指定的字符串是 null、空还是仅由空白字符组成。
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsNullOrWhiteSpace(this string s)
{
return string.IsNullOrWhiteSpace(s);
}
/// <summary>
/// 字符串右侧按长度截取后的字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="length">长度</param>
/// <returns>字符串</returns>
public static string Right(this string s, int length)
{
if (s.IsNullOrEmpty())
{
return s;
}
return length >= s.Length ? s : s.Substring(s.Length - length, length);
}
/// <summary>
/// 是否数字字符串
/// </summary>
/// <param name="s">输入字符串</param>
/// <returns>结果</returns>
public static bool IsNumber(this string s)
{
Regex regNumber = new Regex("^[0-9]+$");
return regNumber.Match(s).Success;
}
/// <summary>
/// 是否数字字符串 可带正负号
/// </summary>
/// <param name="s">输入字符串</param>
/// <returns>结果</returns>
public static bool IsNumberWithSign(this string s)
{
Regex regNumberSign = new Regex("^[+-]?[0-9]+$");
return regNumberSign.Match(s).Success;
}
/// <summary>
/// 检测是否有中文字符
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool HasCnChar(this string s)
{
Regex regChzn = new Regex("[\u4e00-\u9fa5]");
return regChzn.Match(s).Success;
}
/// <summary>
/// 使用utf8编码将字符串散列
/// </summary>
/// <param name="s">要散列的字符串</param>
/// <returns>散列后的字符串</returns>
public static string Md5String(this string s)
{
return s.Md5String(Encoding.UTF8).ToUpper();
}
/// <summary>
/// 使用指定的编码将字符串散列
/// </summary>
/// <param name="s">要散列的字符串</param>
/// <param name="encode">编码</param>
/// <returns>散列后的字符串</returns>
private static string Md5String(this string s, Encoding encode)
{
MD5 md5 = MD5.Create();
try
{
byte[] source = md5.ComputeHash(encode.GetBytes(s));
var sBuilder = new StringBuilder();
foreach (byte str in source)
{
sBuilder.Append(str.ToString("x2"));
}
return sBuilder.ToString();
}
finally
{
md5.Dispose();
}
}
/// <summary>
/// DES加密
/// </summary>
/// <param name="s">待加密字符串</param>
/// <param name="key">密钥</param>
/// <returns>加密后的字符串</returns>
public static string DesEncrypt(this string s, string key = "")
{
try
{
string deskey = key + DefaultCryptString;
byte[] keyBytes = Encoding.UTF8.GetBytes(deskey.Substring(0, 8));
byte[] keyIv = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(s);
var provider = new DESCryptoServiceProvider();
var mStream = new MemoryStream();
var cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIv), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return "";
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="s">待解密字符串</param>
/// <param name="key">密钥</param>
/// <returns>解密后的字符串</returns>
public static string DesDecrypt(this string s, string key = "")
{
try
{
string deskey = key + DefaultCryptString;
byte[] keyBytes = Encoding.UTF8.GetBytes(deskey.Substring(0, 8));
byte[] keyIv = keyBytes;
byte[] inputByteArray = Convert.FromBase64String(s);
var provider = new DESCryptoServiceProvider();
var mStream = new MemoryStream();
var cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIv), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return "";
}
}
/// <summary>
/// DES加密
/// </summary>
/// <param name="s">待加密字符串</param>
/// <param name="key">密钥</param>
/// <returns>加密后的字符串</returns>
public static string MyEncrypt(this string s, string key = "")
{
try
{
string deskey = key + DefaultCryptString;
byte[] keyBytes = Encoding.UTF8.GetBytes(deskey.Substring(0, 8));
byte[] keyIv = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(s);
var provider = new DESCryptoServiceProvider();
var mStream = new MemoryStream();
var cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIv), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
string str = Convert.ToBase64String(mStream.ToArray());
int cnt = 0;
for (int i = str.Length - 1; i >= 0; i--)
{
if (str[i] == '=')
{
cnt++;
}
else
{
break;
}
}
str = str.Left(str.Length - cnt) + cnt;
return str;
}
catch
{
return "";
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="s">待解密字符串</param>
/// <param name="key">密钥</param>
/// <returns>解密后的字符串</returns>
public static string MyDecrypt(this string s, string key = "")
{
try
{
string deskey = key + DefaultCryptString;
byte[] keyBytes = Encoding.UTF8.GetBytes(deskey.Substring(0, 8));
byte[] keyIv = keyBytes;
int cnt = s.Right(1).ToInt();
s = s.Left(s.Length - 1);
for (int i = 0; i < cnt; i++)
{
s = s + "=";
}
byte[] inputByteArray = Convert.FromBase64String(s);
var provider = new DESCryptoServiceProvider();
var mStream = new MemoryStream();
var cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIv), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return "";
}
}
/// <summary>
/// 字符串是否为IP地址
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static bool IsIP4(this string s)
{
string[] strs = s.Split(".");
if (strs.Length != 4)
{
return false;
}
foreach (string str in strs)
{
if (!str.Trim().IsNumber())
{
return false;
}
if (str.Trim().ToInt() < 0)
{
return false;
}
if (str.Trim().ToInt() > 255)
{
return false;
}
}
return true;
}
/// <summary>
/// 分割字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="ignoreEmpty">忽略空字符串</param>
/// <returns>结果</returns>
public static string[] Split(this string s, string separator, bool ignoreEmpty = false)
{
string[] strs = s.Split(new[] { separator }, StringSplitOptions.None);
if (!ignoreEmpty)
{
return strs;
}
List<string> lsts = new List<string>();
foreach (var str in strs)
{
if (!str.IsNullOrEmpty())
{
lsts.Add(str);
}
}
return lsts.ToArray();
}
/// <summary>
/// 字符串包含分隔符的个数
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <returns>个数</returns>
public static int SplitSeparatorCount(this string s, string separator)
{
if (!s.Contains(separator))
{
return 0;
}
string strReplaced = s.Replace(separator, "");
return (s.Length - strReplaced.Length) / separator.Length;
}
/// <summary>
/// 以分隔符分割后的最后一个字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="ignoreEmpty">忽略空字符串</param>
/// <returns>结果</returns>
public static string SplitLast(this string s, string separator, bool ignoreEmpty = false)
{
string[] strs = s.Split(separator, ignoreEmpty);
return strs.Length == 0 ? string.Empty : strs[strs.Length - 1];
}
/// <summary>
/// 以分隔符分割后的第一个字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="ignoreEmpty">忽略空字符串</param>
/// <returns>结果</returns>
public static string SplitFirst(this string s, string separator, bool ignoreEmpty = false)
{
string[] strs = s.Split(separator, ignoreEmpty);
return strs.Length == 0 ? string.Empty : strs[0];
}
/// <summary>
/// 返回字符串分割后指定索引的字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="index">索引</param>
/// <param name="ignoreEmpty">忽略空字符串</param>
/// <returns>结果</returns>
public static string SplitIndex(this string s, string separator, int index, bool ignoreEmpty = false)
{
string[] strs = s.Split(separator, ignoreEmpty);
return strs.Length == 0 ? string.Empty : strs[index];
}
/// <summary>
/// 以分隔符分割的最后一个字符串之前的字符串
/// </summary>
/// <param name="s">字符串</param>
/// <param name="separator">分隔符</param>
/// <returns>结果</returns>
public static string SplitBeforeLast(this string s, string separator)
{
int iLast = s.LastIndexOf(separator, StringComparison.Ordinal);
return iLast > 0 ? s.Substring(0, iLast) : s;
}
/// <summary>
/// 检测输入的邮件地址是否合法非法则返回true。
/// </summary>
/// <param name="s">邮件</param>
/// <returns>结果</returns>
public static bool IsMail(this string s)
{
const string StrWords = "abcdefghijklmnopqrstuvwxyz_-.0123456789"; //定义合法字符范围
string strTmp = s.Trim();
//检测输入字符串是否为空,不为空时才执行代码。
if (strTmp == "" || strTmp.Length == 0)
{
return false;
}
//判断邮件地址中是否存在一个“@”号
if (s.SplitSeparatorCount("@") != 1)
{
return false;
}
//以“@”号为分割符,把地址切分成两部分,分别进行验证。
string[] strChars = strTmp.Split('@');
if (strChars.Length != 2)
{
return false;
}
if (strChars[0] == "" || strChars[1] == "")
{
return false;
}
foreach (string strChar in strChars)
{
//逐个字进行验证如果超出所定义的字符范围strWords则表示地址非法。
int i;
for (i = 0; i < strChar.Length; i++)
{
string strResult = strChar.Substring(i, 1).ToLower();
if (SplitSeparatorCount(StrWords, strResult) == 0)
{
return false;
}
}
}
return true;
}
/// <summary>
/// 英文字符串转换为ASCII编码的数组
/// </summary>
/// <param name="s">字符串</param>
/// <param name="len">长度</param>
/// <returns>结果</returns>
public static byte[] ToEnBytes(this string s, int len)
{
byte[] strs = ToEncodeBytes(s, Encoding.ASCII);
byte[] result = new byte[len];
Array.Copy(strs, 0, result, 0, Math.Min(strs.Length, len));
return result;
}
/// <summary>
/// ASCII编码的数组转换为英文字符串
/// </summary>
/// <param name="s">字符串</param>
/// <returns>结果</returns>
public static string ToEnString(this byte[] s)
{
return ToEncodeString(s, Encoding.ASCII).Trim('\0').Trim();
}
/// <summary>
/// 字符串按指定编码转换为数组
/// </summary>
/// <param name="dealString">字符串</param>
/// <param name="encode">编码</param>
/// <returns>结果</returns>
public static byte[] ToEncodeBytes(this string dealString, Encoding encode)
{
byte[] outs = encode.GetBytes(dealString);
return outs;
}
/// <summary>
/// 数组按指定编码转换为字符串
/// </summary>
/// <param name="dealBytes">数组</param>
/// <param name="encode">编码</param>
/// <returns>结果</returns>
public static string ToEncodeString(this byte[] dealBytes, Encoding encode)
{
return encode.GetString(dealBytes);
}
/// <summary>
/// Gets the string before the given string parameter.
/// </summary>
/// <param name = "value">The default value.</param>
/// <param name = "x">The given string parameter.</param>
/// <returns>结果</returns>
/// <remarks>Unlike GetBetween and GetAfter, this does not Trim the result.</remarks>
public static string Before(this string value, string x)
{
var xPos = value.IndexOf(x, StringComparison.Ordinal);
return xPos == -1 ? string.Empty : value.Substring(0, xPos);
}
/// <summary>
/// Gets the string between the given string parameters.
/// </summary>
/// <param name = "value">The source value.</param>
/// <param name = "x">The left string sentinel.</param>
/// <param name = "y">The right string sentinel</param>
/// <returns>结果</returns>
/// <remarks>Unlike GetBefore, this method trims the result</remarks>
public static string Between(this string value, string x, string y)
{
var xPos = value.IndexOf(x, StringComparison.Ordinal);
var yPos = value.LastIndexOf(y, StringComparison.Ordinal);
if (xPos == -1 || xPos == -1)
{
return string.Empty;
}
var startIndex = xPos + x.Length;
return startIndex >= yPos ? string.Empty : value.Substring(startIndex, yPos - startIndex).Trim();
}
/// <summary>
/// Gets the string after the given string parameter.
/// </summary>
/// <param name = "value">The default value.</param>
/// <param name = "x">The given string parameter.</param>
/// <returns>结果</returns>
/// <remarks>Unlike GetBefore, this method trims the result</remarks>
public static string After(this string value, string x)
{
var xPos = value.LastIndexOf(x, StringComparison.Ordinal);
if (xPos == -1)
{
return string.Empty;
}
var startIndex = xPos + x.Length;
return startIndex >= value.Length ? string.Empty : value.Substring(startIndex).Trim();
}
/// <summary>
/// Encodes the input value to a Base64 string using the default encoding.
/// </summary>
/// <param name = "value">The input value.</param>
/// <returns>The Base 64 encoded string</returns>
public static string Base64Encode(this string value)
{
return value.Base64Encode(null);
}
/// <summary>
/// Encodes the input value to a Base64 string using the supplied encoding.
/// </summary>
/// <param name = "value">The input value.</param>
/// <param name = "encoding">The encoding.</param>
/// <returns>The Base 64 encoded string</returns>
public static string Base64Encode(this string value, Encoding encoding)
{
encoding = (encoding ?? Encoding.UTF8);
var bytes = encoding.GetBytes(value);
return Convert.ToBase64String(bytes);
}
/// <summary>
/// Decodes a Base 64 encoded value to a string using the default encoding.
/// </summary>
/// <param name = "encodedValue">The Base 64 encoded value.</param>
/// <returns>The decoded string</returns>
public static string Base64Decode(this string encodedValue)
{
return encodedValue.Base64Decode(null);
}
/// <summary>
/// Decodes a Base 64 encoded value to a string using the supplied encoding.
/// </summary>
/// <param name = "encodedValue">The Base 64 encoded value.</param>
/// <param name = "encoding">The encoding.</param>
/// <returns>The decoded string</returns>
public static string Base64Decode(this string encodedValue, Encoding encoding)
{
encoding = (encoding ?? Encoding.UTF8);
var bytes = Convert.FromBase64String(encodedValue);
return encoding.GetString(bytes);
}
/// <summary>
/// Calculates the SHA1 hash of the supplied string and returns a base 64 string.
/// </summary>
/// <param name="stringToHash">String that must be hashed.</param>
/// <returns>The hashed string or null if hashing failed.</returns>
/// <exception cref="ArgumentException">Occurs when stringToHash or key is null or empty.</exception>
public static string SHA1Hash(this string stringToHash)
{
if (stringToHash.IsNullOrEmpty())
{
return null;
}
byte[] data = Encoding.UTF8.GetBytes(stringToHash);
byte[] hash = new SHA1CryptoServiceProvider().ComputeHash(data);
return Convert.ToBase64String(hash);
}
/// <summary>
/// Return the string with the leftmost number_of_characters characters removed.
/// </summary>
/// <param name="str">The string being extended</param>
/// <param name="number_of_characters">The number of characters to remove.</param>
/// <returns>结果</returns>
public static string RemoveLeft(this string str, int number_of_characters)
{
if (str.Length <= number_of_characters)
{
return "";
}
return str.Substring(number_of_characters);
}
/// <summary>
/// Return the string with the rightmost number_of_characters characters removed.
/// </summary>
/// <param name="str">The string being extended</param>
/// <param name="number_of_characters">The number of characters to remove.</param>
/// <returns>结果</returns>
public static string RemoveRight(this string str, int number_of_characters)
{
if (str.Length <= number_of_characters)
{
return "";
}
return str.Substring(0, str.Length - number_of_characters);
}
/// <summary>
/// Converts a regular string into SecureString
/// </summary>
/// <param name="u">String value.</param>
/// <param name="makeReadOnly">Makes the text value of this secure string read-only.</param>
/// <returns>Returns a SecureString containing the value of a transformed object. </returns>
public static SecureString ToSecureString(this string u, bool makeReadOnly = true)
{
if (u.IsNullOrEmpty())
{
return null;
}
SecureString s = new SecureString();
foreach (char c in u)
{
s.AppendChar(c);
}
if (makeReadOnly)
{
s.MakeReadOnly();
}
return s;
}
/// <summary>
/// Coverts the SecureString to a regular string.
/// </summary>
/// <param name="s">Object value.</param>
/// <returns>Item of secured string.</returns>
public static string ToUnSecureString(this SecureString s)
{
if (s == null)
{
return null;
}
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(s);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
/// <summary>
/// 压缩字符串
/// </summary>
/// <param name="input">输入</param>
/// <returns>结果</returns>
public static string GZipCompress(this string input)
{
return input.IsNullOrEmpty() ? input : Convert.ToBase64String(Encoding.Default.GetBytes(input).GZipCompress());
}
/// <summary>
/// 解压缩字符串
/// </summary>
/// <param name="input">输入</param>
/// <returns>结果</returns>
public static string GZipDecompress(this string input)
{
return input.IsNullOrEmpty() ? input : Encoding.Default.GetString(Convert.FromBase64String(input).GZipDecompress());
}
/// <summary>
/// 是否是纯英文字母
/// </summary>
/// <param name="str">字符串</param>
/// <returns>结果</returns>
public static bool IsPureEnglishChar(string str)
{
Regex regEnglish = new Regex(@"^[a-zA-Z]+$");
return regEnglish.IsMatch(str);
}
/// <summary>
/// 是否是命名空间
/// </summary>
/// <param name="str">字符串</param>
/// <returns>结果</returns>
public static bool IsNameSpace(string str)
{
Regex regEnglish = new Regex(@"^[a-zA-Z.]+$");
return regEnglish.IsMatch(str) && !str.StartsWith(".") && !str.EndsWith(".") && str.SplitSeparatorCount(".") <= 3 && !str.Contains("..") && !str.Contains("...");
}
/// <summary>
/// 字符串反转
/// </summary>
/// <param name="text">The text.</param>
/// <returns>System.String.</returns>
public static string Reverse(this string text)
{
var charArray = text.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
}
}