将数字从西方阿拉伯数字“1,2,3…”转换为东方阿拉伯数字“١,٢,٣…。”

9
我需要将存储在数据库中的日期转换为Hijri并以阿拉伯语显示。我使用了Culture来转换日期,但它仍然以英文数字显示日期。
例如,公历日期= 19/01/2012 在Hirji中等价的日期是25/02/1433
以下代码片段可以转换日期,但显示结果仍为25/02/1433,而我希望它以阿拉伯数字显示类似于٢٥/٠٢/٢٠١٢的形式。
string sDate    
DateTime dtt = Convert.ToDateTime("19/01/2012");
CultureInfo ci = new CultureInfo("ar-SA");
sDdate = dtt.ToString("d", ci);

有没有一种方法将日期转换为伊斯兰教历并以阿拉伯语显示?

我正在使用 ASP.NET c# 开发一个网站项目,需要用到这个功能。

5个回答

22

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

您需要将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();
    }

结果字符串将类似于“٢٥/٠٢/٢٠١٢”

(该字符串为阿拉伯数字)。

我更喜欢使用linq。string[] arabicDigits = CultureInfo.GetCultureInfo("fa-IR").NumberFormat.NativeDigits; var arabicNumberBuilder = new StringBuilder(); var result = string.Join("", inputString.Select(x => char.IsDigit(x) ? arabicDigits[int.Parse(x.ToString())] : x.ToString())); return result; - Milad

1
我使用 DigitSubstitution 来在印地语(有时称为阿拉伯语)数字和英文数字之间切换:
bool UseHindiNumbers;
//...
if (UseHindiNumbers)
  Thread.CurrentThread.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
else
  Thread.CurrentThread.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.None;

这在.NET Framework 4.5和Windows 10上不起作用。 - M. Jahedbozorgan

0
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

你需要将页面的UI文化设置为阿拉伯语


这将转换日期,但不会将其显示为阿拉伯语“٢٥/٠٢/٢٠١٢”,而是显示为25/02/1433(这是一种伊斯兰教历日期)。 - Learning
你尝试过这个吗?使用UICulture来在所选文化中显示项目。 - Junaid
是的,我已经尝试过使用日历控件,在其中显示阿拉伯语月份但英文日期。 - Learning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接