using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
namespace ShrlAlgoToolkit.Core.Assists;
///
/// 各种验证帮助类
///
internal class ValidatorAssist
{
///
/// 验证用户名:必须以字母开头,可以包含字母、数字、“_”、“.”,至少5个字符
///
///
///
public static bool CheckUserId(string str)
{
var regex = new Regex("[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}");
if (regex.Match(str).Success)
{
if (regex.Matches(str)[0].Value.Length == str.Length)
{
return true;
}
}
return false;
}
///
/// 截取指定长度字符串
///
/// 要处理的字符串
/// 指定长度
/// 返回处理后的字符串
public static string ClipString(string inputString, int len)
{
var isShowFix = false;
if (len % 2 == 1)
{
isShowFix = true;
len--;
}
var ascii = new ASCIIEncoding();
var tempLen = 0;
var tempString = string.Empty;
var s = ascii.GetBytes(inputString);
for (var i = 0; i < s.Length; i++)
{
if (s[i] == 63)
{
tempLen += 2;
}
else
{
tempLen += 1;
}
try
{
tempString += inputString.Substring(i, 1);
}
catch
{
break;
}
if (tempLen > len)
{
break;
}
}
var mybyte = Encoding.Default.GetBytes(inputString);
if (isShowFix && mybyte.Length > len)
{
tempString += "…";
}
return tempString;
}
///
/// 获得两个日期的间隔
///
/// 日期一。
/// 日期二。
/// 日期间隔TimeSpan。
public static TimeSpan DateDiff(DateTime dateTime1, DateTime dateTime2)
{
var ts1 = new TimeSpan(dateTime1.Ticks);
var ts2 = new TimeSpan(dateTime2.Ticks);
var ts = ts1.Subtract(ts2).Duration();
return ts;
}
///
/// 格式化日期时间
///
/// 日期时间
/// 显示模式
/// 0-9种模式的日期
public static string FormatDate(DateTime dateTime1, string dateMode)
{
return dateMode switch
{
"0" => dateTime1.ToString("yyyy-MM-dd"),
"1" => dateTime1.ToString("yyyy-MM-dd HH:mm:ss"),
"2" => dateTime1.ToString("yyyy/MM/dd"),
"3" => dateTime1.ToString("yyyy年MM月dd日"),
"4" => dateTime1.ToString("MM-dd"),
"5" => dateTime1.ToString("MM/dd"),
"6" => dateTime1.ToString("MM月dd日"),
"7" => dateTime1.ToString("yyyy-MM"),
"8" => dateTime1.ToString("yyyy/MM"),
"9" => dateTime1.ToString("yyyy年MM月"),
_ => dateTime1.ToString(CultureInfo.InvariantCulture),
};
}
///
/// 得到随机日期
///
/// 起始日期
/// 结束日期
/// 间隔日期之间的 随机日期
public static DateTime GetRandomTime(DateTime time1, DateTime time2)
{
var random = new Random();
DateTime minTime;
var ts = new TimeSpan(time1.Ticks - time2.Ticks);
// 获取两个时间相隔的秒数
var dTotalSecontds = ts.TotalSeconds;
int iTotalSecontds;
if (dTotalSecontds > int.MaxValue)
{
iTotalSecontds = int.MaxValue;
}
else
{
iTotalSecontds = dTotalSecontds < int.MinValue ? int.MinValue : (int)dTotalSecontds;
}
if (iTotalSecontds > 0)
{
minTime = time2;
}
else if (iTotalSecontds < 0)
{
minTime = time1;
}
else
{
return time1;
}
var maxValue = iTotalSecontds;
if (iTotalSecontds <= int.MinValue)
{
maxValue = int.MinValue + 1;
}
var i = random.Next(Math.Abs(maxValue));
return minTime.AddSeconds(i);
}
///
/// 验证是否包含汉语
///
/// The source
/// The
public static bool HasChinese(string source)
{
return Regex.IsMatch(source, @"[\u4e00-\u9fa5]+", RegexOptions.IgnoreCase);
}
///
/// 全部是中文
///
///
///
public static bool IsChinese(string source)
{
return Regex.IsMatch(source, @"^[\u4e00-\u9fa5]+$", RegexOptions.IgnoreCase);
}
///
/// The IsDate
///
/// The str
/// The
public static bool IsDate(string str)
{
//考虑到了4年一度的366天,还有特殊的2月的日期
var reg = new Regex(
@"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$"
);
return reg.IsMatch(str);
}
///
/// 是否为数字型
///
///
///
public static bool IsDecimal(string strNumber)
{
return new Regex(@"^([0-9])[0-9]*(\.\w*)?$").IsMatch(strNumber);
}
///
/// 验证是否全部汉语
///
///
///
public static bool IsHanyuAll(string str)
{
var regex = new Regex("[\u4e00-\u9fa5]");
//匹配的内容长度和被验证的内容长度相同时,验证通过
if (regex.Match(str).Success)
{
if (regex.Matches(str).Count == str.Length)
{
return true;
}
}
//其它,未通过
return false;
}
///
/// 验证是否为整数 如果为空,认为验证不合格 返回false
///
/// 要验证的整数
/// The
public static bool IsInt(string number)
{
//如果为空,认为验证不合格
if (IsNullOrEmpty(number))
{
return false;
}
//清除要验证字符串中的空格
number = number.Trim();
//模式字符串
var pattern = @"^[0-9]+[0-9]*$";
//验证
return Regex.IsMatch(number, pattern);
}
///
/// 是不是Int型的
///
///
///
public static bool IsIntInRegex(string source)
{
var regex = new Regex(@"^(-){0,1}\d+$");
if (regex.Match(source).Success)
{
return long.Parse(source) is <= 0x7fffffffL and >= (-2147483648L);
}
return false;
}
///
/// 看字符串的长度是不是在限定数之间 一个中文为两个字符
///
/// 字符串
/// 大于等于
/// 小于等于
///
public static bool IsLengthStr(string source, int begin, int end)
{
var length = Regex.Replace(source, @"[^\x00-\xff]", "OK").Length;
return length > begin || length < end;
}
///
/// 验证是不是正常字符 字母,数字,下划线的组合
///
///
///
public static bool IsNormalChar(string source)
{
return Regex.IsMatch(source, @"[\w\d_]+", RegexOptions.IgnoreCase);
}
///
/// 判断对象是否为空,为空返回true
///
/// 要验证的对象的类型
/// 要验证的对象
/// The
public static bool IsNullOrEmpty(T data)
{
//如果为null
if (data == null)
{
return true;
}
//如果为""
if (data is string)
{
if (string.IsNullOrEmpty(data.ToString().Trim()))
{
return true;
}
}
//如果为DBNull
if (data is DBNull)
{
return true;
}
//不为空
return false;
}
///
/// 判断对象是否为空,为空返回true
///
/// 要验证的对象
/// The
public static bool IsNullOrEmpty(object data)
{
//如果为null
if (data == null)
{
return true;
}
//如果为""
if (data is string)
{
if (string.IsNullOrEmpty(data.ToString().Trim()))
{
return true;
}
}
//如果为DBNull
if (data is DBNull)
{
return true;
}
//不为空
return false;
}
///
/// 判断字符串是否为数字
///
/// 待验证的字符窜
/// bool
public static bool IsNumber(string str)
{
return str.All(ar => char.IsNumber(ar));
}
///
/// 验证是否为数字
///
/// 要验证的数字
/// The
public static bool IsNumberInRegex(string number)
{
//如果为空,认为验证不合格
if (IsNullOrEmpty(number))
{
return false;
}
//清除要验证字符串中的空格
number = number.Trim();
//模式字符串
var pattern = @"^[0-9]+[0-9]*[.]?[0-9]*$";
//验证
return Regex.IsMatch(number, pattern);
}
///
/// 检测客户输入的字符串是否有效,并将原始字符串修改为有效字符串或空字符串。
/// 当检测到客户的输入中有攻击性危险字符串,则返回false,有效返回true。
///
/// 要检测的字符串
/// The
public static bool IsValidInput(ref string input)
{
try
{
if (IsNullOrEmpty(input))
{
//如果是空值,则跳出
return true;
}
//替换单引号
input = input.Replace("'", "''").Trim();
//检测攻击性危险字符串
var testString = "and |or |exec |insert |select |delete |update |count |chr |mid |master |truncate |char |declare ";
var testArray = testString.Split('|');
foreach (var testStr in testArray)
{
if (input.ToLower().IndexOf(testStr, StringComparison.Ordinal) != -1)
{
//检测到攻击字符串,清空传入的值
input = string.Empty;
return false;
}
}
//未检测到攻击字符串
return true;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
///
/// 得到字符串长度,一个汉字长度为2
///
/// 参数字符串
///
public static int StrLength(string inputString)
{
var ascii = new ASCIIEncoding();
var tempLen = 0;
var s = ascii.GetBytes(inputString);
for (var i = 0; i < s.Length; i++)
{
if (s[i] == 63)
{
tempLen += 2;
}
else
{
tempLen += 1;
}
}
return tempLen;
}
///
/// The IsValidByte
///
/// The strIn
/// The
internal bool IsValidByte(string strIn)
{
return Regex.IsMatch(strIn, @"^[a-z]{4,12}$");
}
///
/// The IsValidDate
///
/// The strIn
/// The
internal bool IsValidDate(string strIn)
{
return Regex.IsMatch(
strIn,
@"^2d{3}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[1-2]d|3[0-1])(?:0?[1-9]|1d|2[0-3]):(?:0?[1-9]|[1-5]d):(?:0?[1-9]|[1-5]d)$"
);
}
///
/// The IsValidDecimal
///
/// The strIn
/// The
internal bool IsValidDecimal(string strIn)
{
return Regex.IsMatch(strIn, @"[0].d{1,2}|[1]");
}
///
/// The IsValidPostfix
///
/// The strIn
/// The
internal bool IsValidPostfix(string strIn)
{
return Regex.IsMatch(strIn, @".(?i:gif|jpg)$");
}
}