如何将英文数字转换为阿拉伯数字?

时间:2010-02-19 17:05:00

标签: c# cultureinfo

我有这个C#代码,例如

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

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

???? 19, 2010

但我不希望'2010'和'19'用英语(也称为拉丁语或West Arabic数字) - 我希望东阿拉伯语数字像“2”。

我试过

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

给出了相同的结果。 那么任何想法?

7 个答案:

答案 0 :(得分:13)

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

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();

答案 1 :(得分: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

要将数字转换为阿拉伯语文本,看起来this "NumToArabicString" project会执行此操作。它看起来并不像.net框架中有任何东西。

答案 2 :(得分:4)

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

除了文明感知类(如{{1它似乎未实现或其他。

答案 3 :(得分: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');
    }
}

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我已采用@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;
    }
}

希望对您有帮助。