Files
FrontOffice/src/FrontOffice.Main/Utilities/Extensions.cs
MeysamMoghaddam b9a0cdff83 u
2025-10-13 08:42:31 +03:30

440 lines
15 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.
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Net;
using System.Reflection;
using System.Text.RegularExpressions;
using Google.Protobuf.WellKnownTypes;
using Microsoft.AspNetCore.Components.Forms;
namespace FrontOffice.Main.Utilities;
public static class Extensions
{
public static CultureInfo GetPersianCulture()
{
var culture = new CultureInfo("fa-IR");
DateTimeFormatInfo formatInfo = culture.DateTimeFormat;
formatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
formatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" };
var monthNames = new[]
{
"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن",
"اسفند",
"",
};
formatInfo.AbbreviatedMonthNames =
formatInfo.MonthNames =
formatInfo.MonthGenitiveNames = formatInfo.AbbreviatedMonthGenitiveNames = monthNames;
formatInfo.AMDesignator = "ق.ظ";
formatInfo.PMDesignator = "ب.ظ";
formatInfo.ShortDatePattern = "yyyy/MM/dd";
formatInfo.LongDatePattern = "dddd, dd MMMM,yyyy";
formatInfo.FirstDayOfWeek = DayOfWeek.Saturday;
Calendar cal = new PersianCalendar();
FieldInfo fieldInfo = culture.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo != null)
fieldInfo.SetValue(culture, cal);
FieldInfo info = formatInfo.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance);
if (info != null)
info.SetValue(formatInfo, cal);
culture.NumberFormat.NumberDecimalSeparator = "/";
culture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
culture.NumberFormat.NumberNegativePattern = 0;
return culture;
}
public static string ExtractUserFriendlyMessage(this string errorMessage)
{
// کلیدواژه‌ای که بعد از آن بخش مورد نظر شروع می‌شود
string keyword = "Exception:";
// بررسی وجود کلیدواژه در پیام خطا
int keywordIndex = errorMessage.IndexOf(keyword);
if (keywordIndex >= 0)
{
// استخراج بخش بعد از کلیدواژه
string userFriendlyMessage = errorMessage.Substring(keywordIndex + keyword.Length).Trim();
if (userFriendlyMessage.EndsWith(")"))
{
userFriendlyMessage = userFriendlyMessage.Substring(0, userFriendlyMessage.Length - 2);
}
return userFriendlyMessage;
}
// اگر کلیدواژه وجود نداشت، کل پیام خطا برگردانده شود
return errorMessage;
}
public static string DiffDateTime(this DateTime dateTime)
{
const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;
var ts = new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks);
double delta = Math.Abs(ts.TotalSeconds);
if (delta < 1 * MINUTE)
{
return ts.Seconds == 1 ? "لحظه ای قبل" : ts.Seconds + " ثانیه قبل";
}
if (delta < 2 * MINUTE)
{
return "یک دقیقه قبل";
}
if (delta < 45 * MINUTE)
{
return ts.Minutes + " دقیقه قبل";
}
if (delta < 90 * MINUTE)
{
return "یک ساعت قبل";
}
if (delta < 24 * HOUR)
{
return ts.Hours + " ساعت قبل";
}
if (delta < 48 * HOUR)
{
return "دیروز";
}
if (delta < 30 * DAY)
{
return ts.Days + " روز قبل";
}
if (delta < 12 * MONTH)
{
int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
return months <= 1 ? "یک ماه قبل" : months + " ماه قبل";
}
int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
return years <= 1 ? "یک سال قبل" : years + " سال قبل";
}
public static string StripHtmlTags(this string html)
{
if (string.IsNullOrEmpty(html))
return string.Empty;
// حذف تمامی تگ‌های HTML
string textOnly = Regex.Replace(html, "<.*?>", string.Empty);
// تبدیل کاراکترهای HTML به متن معمولی (مثلاً &nbsp; -> فضای خالی)
textOnly = WebUtility.HtmlDecode(textOnly);
return textOnly.Trim();
}
public static string ConfuseId(this string? value)
{
if (!string.IsNullOrWhiteSpace(value) && value.Length > 6)
return string.Concat(value[..3], "*****", value.AsSpan(value.Length - 3, 3));
else if (!string.IsNullOrWhiteSpace(value) && value.Length > 4)
return string.Concat(value[..2], "*****", value.AsSpan(value.Length - 2, 2));
else
return value;
}
public static Timestamp DateTimeToTimestamp(this DateTime dateTime)
{
return Timestamp.FromDateTime(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc));
}
public static Timestamp? DateTimeToTimestamp(this DateTime? dateTime)
{
if (dateTime == null)
return null;
return Timestamp.FromDateTime(DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc));
}
//public static string ToThousands(this string numberString)
//{
// if (double.TryParse(numberString, out var number))
// {
// return string.Format("{0:#,###0.################}", number);
// }
// return numberString;
//}
public static string ToThousands(this string numberString)
{
if (double.TryParse(numberString, out var number))
{
// حذف اعشار
var integerPart = Math.Truncate(number);
// فرمت‌بندی سه رقمی
return string.Format("{0:#,###0}", integerPart);
}
else
{
if (numberString.Split('.').Length > 1)
return numberString.Split('.')[0];
}
return numberString;
}
public static string ToThousands(this long number)
{
return number.ToString().ToThousands();
}
public static string ToThousands(this long? number)
{
return number?.ToString().ToThousands();
}
public static string ToThousands(this int number)
{
return number.ToString().ToThousands();
}
public static string ToThousands(this int? number)
{
return number?.ToString().ToThousands();
}
public static string ToThousands(this float number)
{
return number.ToString().ToThousands();
}
public static string ToThousands(this float? number)
{
return number?.ToString().ToThousands();
}
public static string ToThousands(this double number)
{
return number.ToString().ToThousands();
}
public static string ToThousands(this double? number)
{
return number?.ToString().ToThousands();
}
public static long ToIRT(this long number)
{
return (long)(number * 0.1);
}
public static string ToCurrencyUnitIRR(this string str) => str + " ریال";
public static string ToCurrencyUnitIRT(this string str) => str + " تومان";
public static string FaToAr(this string str) => str.Replace("ک", "ك").Replace("ی", "ي");
public static string ArToFa(this string str) => str.Replace("ك", "ک").Replace("ي", "ی");
public static string Truncate(this string value, int maxLength, bool isAppendDots = false)
{
if (string.IsNullOrEmpty(value)) return value;
return value.Length <= maxLength ? value : isAppendDots ? value.Substring(0, maxLength) + "..." : value.Substring(0, maxLength);
}
public static string PersianToEnglish(this string persianStr)
{
return persianStr.Replace("۰", "0")
.Replace("۱", "1")
.Replace("۲", "2")
.Replace("۳", "3")
.Replace("۴", "4")
.Replace("۵", "5")
.Replace("۶", "6")
.Replace("۷", "7")
.Replace("۸", "8")
.Replace("۹", "9");
}
public static string GetDisplayName(this System.Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DisplayAttribute>()
.GetName();
}
public static async Task<string> ConvertIBrowserFileToBase64(this IBrowserFile? file)
{
if (file == null)
{
return string.Empty;
}
const long maxAllowedSize = 1024 * 1024 * 200;
var imageBuffers = new byte[file.Size];
using (var stream = file.OpenReadStream(maxAllowedSize))
{
await stream.ReadAsync(imageBuffers);
}
return $"data:{file.ContentType};base64," + Convert.ToBase64String(imageBuffers);
}
public static string GetNumberToPersianString(this string txt)
{
string RET = " ", STRVA = " ";
string[] MainStr = STR_To_Int(txt);
int Q = 0;
for (int i = MainStr.Length - 1; i >= 0; i--)
{
STRVA = " ";
if (RET != " " && RET != null)
STRVA = " و ";
if (string.IsNullOrWhiteSpace(Convert_STR(GETCountStr(MainStr[i]), Q)))
RET = Convert_STR(GETCountStr(MainStr[i]), Q) + RET;
else
RET = Convert_STR(GETCountStr(MainStr[i]), Q) + STRVA + RET;
Q++;
}
if (RET == " " || RET == null || RET == " ")
RET = "صفر";
return RET;
}
private static string[] STR_To_Int(string STR)
{
STR = GETCountStr(STR);
string[] RET = new string[STR.Length / 3];
int Q = 0;
for (int I = 0; I < STR.Length; I += 3)
{
RET[Q] = STR.Substring(I, 3);
Q++;
}
return RET;
}
private static string GETCountStr(string STR)
{
string RET = STR;
int LEN = (STR.Length / 3 + 1) * 3 - STR.Length;
if (LEN < 3)
{
for (int i = 0; i < LEN; i++)
{
RET = "0" + RET;
}
}
if (RET == "")
return "000";
return RET;
}
private static string Convert_STR(string INT, int Count)
{
string RET = "";
//یک صد
if (Count == 0)
{
if (INT.Substring(1, 1) == "1" && INT.Substring(2, 1) != "0")
{
RET = GET_Number(3, Convert.ToInt32(INT.Substring(0, 1)), " ") + GET_Number(1, Convert.ToInt32(INT.Substring(2, 1)), "");
}
else
{
string STR = GET_Number(0, Convert.ToInt32(INT.Substring(2, 1)), "");
RET = GET_Number(3, Convert.ToInt32(INT.Substring(0, 1)), GET_Number(2, Convert.ToInt32(INT.Substring(1, 1)), "") + STR) + GET_Number(2, Convert.ToInt32(INT.Substring(1, 1)), STR) + GET_Number(0, Convert.ToInt32(INT.Substring(2, 1)), "");
}
}
//هزار
else if (Count == 1)
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += " هزار";
}
//میلیون
else if (Count == 2)
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += " میلیون";
}
//میلیارد
else if (Count == 3)
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += " میلیارد";
}
//میلیارد
else if (Count == 4)
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += " تیلیارد";
}
//میلیارد
else if (Count == 5)
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += " بیلیارد";
}
else
{
RET = Convert_STR(INT, 0);
if (string.IsNullOrWhiteSpace(RET))
return string.Empty;
RET += Count.ToString();
}
return RET;
}
private static string GET_Number(int Count, int Number, string VA)
{
string RET = "";
if (VA != "" && VA != null)
{
VA = " و ";
}
if (Count == 0 || Count == 1)
{
bool IsDah = Convert.ToBoolean(Count);
string[] MySTR = new string[10];
MySTR[1] = IsDah ? "یازده" : "یک" + VA;
MySTR[2] = IsDah ? "دوازده" : "دو" + VA;
MySTR[3] = IsDah ? "سیزده" : "سه" + VA;
MySTR[4] = IsDah ? "چهارده" : "چهار" + VA;
MySTR[5] = IsDah ? "پانزده" : "پنج" + VA;
MySTR[6] = IsDah ? "شانزده" : "شش" + VA;
MySTR[7] = IsDah ? "هفده" : "هفت" + VA;
MySTR[8] = IsDah ? "هجده" : "هشت" + VA;
MySTR[9] = IsDah ? "نوزده" : "نه" + VA;
return MySTR[Number];
}
else if (Count == 2)
{
string[] MySTR = new string[10];
MySTR[1] = "ده";
MySTR[2] = "بیست" + VA;
MySTR[3] = "سی" + VA;
MySTR[4] = "چهل" + VA;
MySTR[5] = "پنجاه" + VA;
MySTR[6] = "شصت" + VA;
MySTR[7] = "هفتاد" + VA;
MySTR[8] = "هشتاد" + VA;
MySTR[9] = "نود" + VA;
return MySTR[Number];
}
else if (Count == 3)
{
string[] MySTR = new string[10];
MySTR[1] = "یکصد" + VA;
MySTR[2] = "دویست" + VA;
MySTR[3] = "سیصد" + VA;
MySTR[4] = "چهارصد" + VA;
MySTR[5] = "پانصد" + VA;
MySTR[6] = "ششصد" + VA;
MySTR[7] = "هفتصد" + VA;
MySTR[8] = "هشتصد" + VA;
MySTR[9] = "نهصد" + VA;
return MySTR[Number];
}
return RET;
}
}