12

例如,我有这个 C# 代码

DateTime.Now.ToString("MMMM dd, yyyy");

现在当前线程正在加载阿拉伯文化。所以结果是这样的

???? 19, 2010

但我不希望 '2010' 和 '19' 是英文(也称为拉丁或西阿拉伯数字) - 我想要像“٢”这样的东阿拉伯数字。

我试过

DateTime.Now.ToString("MMMM dd, yyyy", CultureInfo.GetCultureInfo("ar-lb"));

给出了相同的结果。那么有什么想法吗?

4

8 回答 8

18

你这个解决方法(只需列出你想在字符串数组中使用这个数字的所有文化):

private static class ArabicNumeralHelper
{
    public static string ConvertNumerals(this string input)
    {
        if (new string[] { "ar-lb", "ar-SA" }
              .Contains(Thread.CurrentThread.CurrentCulture.Name))
        {
            return input.Replace('0', '\u06f0')
                    .Replace('1', '\u06f1')
                    .Replace('2', '\u06f2')
                    .Replace('3', '\u06f3')
                    .Replace('4', '\u06f4')
                    .Replace('5', '\u06f5')
                    .Replace('6', '\u06f6')
                    .Replace('7', '\u06f7')
                    .Replace('8', '\u06f8')
                    .Replace('9', '\u06f9');
        }
        else return input;
    }
}

然后使用该方法,为所有strings你想要有“中央阿拉伯数字”的人,像这样:

DateTime.Now.ToString().ConvertNumerals();
于 2010-02-19T18:17:02.270 回答
6

作为一个快速测试,我写了这个来列出当年没有“2010”的所有文化:

        foreach (var ci in 
            from c in CultureInfo.GetCultures(CultureTypes.AllCultures)
            where !c.IsNeutralCulture
            let date = DateTime.Now.ToString("MMMM dd, yyyy", c)
            where !date.Contains("2010")
            orderby c.Name
            select new {c.Name, date})
        {
            Console.WriteLine("{0} : {1}", ci.Name, ci.date);
        }

结果是:

ar-SA : ربيع الأول 05, 1431
dv-MV : ربيع الأول 06, 1431
prs-AF : ربيع الأول 06, 1431
ps-AF : ربيع الأول 06, 1431
th-TH : กุมภาพันธ์ 19, 2553

要将数字转换为阿拉伯文本,看起来这个“NumToArabicString”项目可以做到。不过,.net 框架中似乎没有内置任何东西。

于 2010-02-19T17:54:58.857 回答
6

唯一的解决方案是手动转换数字。

您可以使用CurrentCulture.NumberFormat.NativeDigits数组而不是显式提供 Unicode 字符来支持除阿拉伯印度数字之外的任何其他语言,但就文化感知类的内置支持而言,例如DateTime它似乎未实现或其他东西。

于 2010-05-19T16:51:05.830 回答
3

试试这个:

public static string ToIndicDigits(this string input)
{
        return input.Replace('0', '\u0660')
                .Replace('1', '\u0661')
                .Replace('2', '\u0662')
                .Replace('3', '\u0663')
                .Replace('4', '\u0664')
                .Replace('5', '\u0665')
                .Replace('6', '\u0666')
                .Replace('7', '\u0667')
                .Replace('8', '\u0668')
                .Replace('9', '\u0669');
    }
}
于 2013-08-13T16:28:45.693 回答
3

我采用了@Marcel B 方法/解决方法,因为我面临与原始问题状态相同的问题。

就我而言,它适用于“ar-KW”文化。唯一的区别是我使用的NumberFormat.NativeDigits已经是CultureInfo的一部分。

您可以像这样检查(基于您当前的线程场景):

Thread.CurrentThread.CurrentCulture.NumberFormat.NativeDigits

因此,代码将如下所示:

private static class ArabicNumeralHelper
{
    public static string ConvertNumerals(this string input)
    {
        CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;

        if (new string[] { "ar-lb", "ar-SA" }
              .Contains(cultureInfo.Name))
        {
            return input.Replace('0', cultureInfo.NumberFormat.NativeDigits[0])
                        .Replace('1', cultureInfo.NumberFormat.NativeDigits[1])
                        .Replace('2', cultureInfo.NumberFormat.NativeDigits[2])
                        .Replace('3', cultureInfo.NumberFormat.NativeDigits[3])
                        .Replace('4', cultureInfo.NumberFormat.NativeDigits[4])
                        .Replace('5', cultureInfo.NumberFormat.NativeDigits[5])
                        .Replace('6', cultureInfo.NumberFormat.NativeDigits[6])
                        .Replace('7', cultureInfo.NumberFormat.NativeDigits[7])
                        .Replace('8', cultureInfo.NumberFormat.NativeDigits[8])
                        .Replace('9', cultureInfo.NumberFormat.NativeDigits[9]);
        }
        else return input;
    }
}

我希望它有所帮助。

于 2019-10-02T10:36:56.220 回答
2

您可以使用Windows.Globalization.NumberFormatting.NumeralSystemTranslator类在拉丁语和任何受支持的数字系统之间进行转换。要翻译成阿拉伯语,请将NumeralSystem属性设置为"Arab",然后您可以调用该TranslateNumerals方法。

或者,您可以直接使用Windows.Globalization.DateTimeFormatting.DateTimeFormatter类。

于 2013-09-24T18:04:49.763 回答
0

这也是转换数字 35852 的选项:

string.Join("", 35852.ToString().Select(x => CultureInfo.GetCultureInfo("ar-lb").NumberFormat.NativeDigits[int.Parse(x.ToString())]));

输出:

٣٥٨٥٢ 
于 2021-09-02T10:49:54.750 回答
-1

我们在英语中使用阿拉伯数字。因此,您所看到的是正确且唯一可能的行为。

于 2010-02-19T17:46:01.750 回答