Преобразование чисел из западно-арабских цифр "1,2,3 ..." в восточно-арабские цифры "١, ٢, ٣ ...." - PullRequest
7 голосов
/ 19 января 2012

Мне нужно преобразовать дату, хранящуюся в базе данных, в хиджры и отобразить ее на арабском языке

Я использовал Культуру, чтобы преобразовать дату, которую она делает, но она все равно отображает дату в виде английских чисел

Пример григорианской даты = 19/01/2012 Его эквивалентная дата в Хирджи - 25/02/1433

Следующий фрагмент кода преобразуется, но отображается так же, как 25/02/1433 Хотя я хочу его в арабских числах что-то вроде like /100/٢٠١٢ "

string sDate    
DateTime dtt = Convert.ToDateTime("19/01/2012");
CultureInfo ci = new CultureInfo("ar-SA");
sDdate = dtt.ToString("d", ci);

Есть ли там, где он конвертирует дату в хиджры и отображает так же, как арабский

Мне нужно это для веб-проекта, который я разрабатываю в ASP.NET c #

Ответы [ 5 ]

19 голосов
/ 19 января 2012

Класс CultureInfo не поможет вам ни в синтаксическом анализе, ни в форматировании чисел на восточном арабском языке ("٠", "١", "٢", "٣", "٤", "٥", "٦", " ٧ "," ٨ "," ٩ ") или на западно-арабский язык (" 0 "," 1 "," 2 "," 3 "," 4 "," 5 "," 6 "," 7 "," 8 "," 9 "). Вы должны конвертировать его вручную. Вот небольшая функция, которая сделает это за вас аккуратно:

public string ConvertToEasternArabicNumerals(string input)
    {
        System.Text.UTF8Encoding utf8Encoder = new UTF8Encoding();
        System.Text.Decoder utf8Decoder = utf8Encoder.GetDecoder();
        System.Text.StringBuilder convertedChars = new System.Text.StringBuilder();
        char[] convertedChar = new char[1];
        byte[] bytes = new byte[] { 217, 160 };
        char[] inputCharArray = input.ToCharArray();
        foreach (char c in inputCharArray)
        {
            if (char.IsDigit(c))
            {
                bytes[1] = Convert.ToByte(160 + char.GetNumericValue(c));
                utf8Decoder.GetChars(bytes, 0, 2, convertedChar, 0);
                convertedChars.Append(convertedChar[0]);
            }
            else
            {
                convertedChars.Append(c);
            }
        }
        return convertedChars.ToString();
    }

Теперь немного измените ваш код, чтобы он выглядел следующим образом:

string sDate    
DateTime dtt = Convert.ToDateTime("19/01/2012");
CultureInfo ci = new CultureInfo("ar-SA");
sDate = ConvertToEasternArabicNumerals(dtt.ToString("dd/MM/yyyy", ci));

И все будет работать отлично. Кстати, код для функции был взят из здесь .

5 голосов
/ 27 февраля 2016

Вы должны преобразовать HijriDate в строку, предполагая, что ее имя - stringHijriDate. Затем используйте функцию, подобную приведенной ниже, чтобы преобразовать ее цифры в арабскую цифру:

  public static string ToArabicNumber(this string inputString)
    {
        string[] arabicDigits = CultureInfo.GetCultureInfo("fa-IR").NumberFormat.NativeDigits;
        var arabicNumberBuilder = new StringBuilder();
        foreach (char c in inputString)
        {
            if (char.IsDigit(c))
                arabicNumberBuilder.Append(arabicDigits[int.Parse(c.ToString())]);
            else
                arabicNumberBuilder.Append(c);
        }
        return arabicNumberBuilder.ToString();
    }

строка результата будет что-то вроде '٢٥/٠٢/٢٠١٢'

0 голосов
/ 26 декабря 2013
Private Function DigitContext(ByVal Vl As String) As String
    Dim ks As String
    Dim c As Integer
    Dim t As Integer
    ks = "" 'reset the returned string
    For t = 1 To Vl.Length
        c = AscW(Vl.Substring(t - 1, 1))
        Select Case c
            Case &H30 To &H39
                ks = ks & ChrW(c + &H630)
            Case 46
                ks = ks & ChrW(1548) '&H060C 'ks = ks & ","
            Case Else
                ks = ks & Mid(Vl, t, 1)
        End Select
    Next
    Return ks

End Function
0 голосов
/ 15 октября 2013

Я использую DigitSubstitution для переключения между номерами хинди (иногда называемыми арабскими) и английскими:

bool UseHindiNumbers;
//...
if (UseHindiNumbers)
  Thread.CurrentThread.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
else
  Thread.CurrentThread.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.None;
0 голосов
/ 19 января 2012

вам нужно будет установить язык интерфейса пользователя на арабский

...