Skip to content

درصورتی که فیلدی شامل حروف و عدد باشه اعداد برعکس میخوره #4

@alirezapaydar

Description

@alirezapaydar

درصورتی که فیلدی شامل حروف و عدد باشه اعداد برعکس میخوره

مثلا خروجی باید:
"سعید سالاری 09122222120" باشه
به این شکله "سعید سالاری 02122222190" که اشتباهه.

که من متد UnicodeFrom شما را به شکل زیر تغییر دادم:
///

    /// تبدیل یک رشته ایران سیستم به یونیکد
    /// </summary>


    /// <param name="iranSystemEncodedString">رشته ایران سیستم</param>
    /// <returns></returns>
    public static string UnicodeFrom(TextEncoding textEncoding, string iranSystemEncodedString)
    {
        // وهله سازی از انکودینگ صحیح برای تبدیل رشته ایران سیستم به بایت
        Encoding encoding = Encoding.GetEncoding((int)textEncoding);
        // حذف فاصله های موجود در رشته
        iranSystemEncodedString = iranSystemEncodedString.Replace(" ", "");
        if (iranSystemEncodedString.Length <= 0)
            return "";
        // تبدیل رشته به بایت
        byte[] stringBytes = encoding.GetBytes(iranSystemEncodedString.Trim());

        // تغییر ترتیب بایت هااز آخر به اول در صورتی که رشته تماماً عدد نباشد
        if (!IsNumber(iranSystemEncodedString))
        {
            stringBytes = stringBytes.Reverse().ToArray();
        }

        // آرایه ای که بایت های معادل را در آن قرار می دهیم
        // مجموع تعداد بایت های رشته + بایت های اضافی محاسبه شده
        byte[] newStringBytes = new byte[stringBytes.Length + CountCharactersRequireTwoBytes(stringBytes)];

        int index = 0;

        // بررسی هر بایت و پیدا کردن بایت (های) معادل آن
        for (int i = 0; i < stringBytes.Length; ++i)
        {
            byte charByte = stringBytes[i];

            // اگر جز 128 بایت اول باشد که نیازی به تبدیل ندارد چون کد اسکی است
            if (charByte < 128)
            {
                newStringBytes[index] = charByte;
            }
            else
            {
                // اگر جز حروف یا اعداد بود معادلش رو قرار می دیم
                if (CharactersMapper.ContainsKey(charByte))
                {
                    newStringBytes[index] = CharactersMapper[charByte];
                }
            }

            // اگر کاراکتر ایران سیستم "لا" بود چون کاراکتر متناظرش در عربی 1256 "ل" است و باید یک "ا" هم بعدش اضافه کنیم
            if (charByte == 242)
            {
                newStringBytes[++index] = 199;
            }

            // اگر کاراکتر یکی از انواعی بود که بعدشان باید یک فاصله باشد
            // و در عین حال آخرین کاراکتر رشته نبود
            if (charactersWithSpaceAfter.Contains(charByte) && Array.IndexOf(stringBytes, charByte) != stringBytes.Length - 1)
            {
                // یک فاصله بعد ان اضافه می کنیم
                newStringBytes[++index] = 32;
            }

            index += 1;
        }

        // تبدیل به رشته و ارسال به فراخواننده
        byte[] unicodeContent = Encoding.Convert(encoding, Encoding.Unicode, newStringBytes);

        string result = Encoding.Unicode.GetString(unicodeContent).Trim();
        result = result.Replace("ڑ", "ء").Replace("ؤ", "ئ");

        //در صورتی که عدد داخل رشته نیست نیاز به ادامه کار نمی باشد
        if (!Regex.IsMatch(result, @"\d"))
            return result;

        bool isLastDigit = false;
        string tempForDigits = "";
        string str="";
        for (int i = 0; i < result.Length; i++)
        {
            if (Regex.IsMatch(result[i].ToString(), @"\d") || (i+1<result.Length && Regex.IsMatch(result[i].ToString() + result[i+1].ToString(), @"/\d")))
            {
                isLastDigit = true;
                tempForDigits += result[i];
            }
            else
            {
                if (isLastDigit && tempForDigits.Length > 0)
                {
                    str += new string(tempForDigits.Reverse().ToArray());
                    isLastDigit = false;
                    tempForDigits = "";
                }
                 str += result[i];
            }
            if (!String.IsNullOrWhiteSpace(tempForDigits) && i == result.Length - 1)
            {
                str += new string(tempForDigits.Reverse().ToArray());
            }
        }
        return str;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions