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

发布于 2024-08-22 09:07:11 字数 475 浏览 4 评论 0原文

例如,我有这个 C# 代码

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

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

???? 19, 2010

但我不希望“2010”和“19”是英语(也称为拉丁语或西阿拉伯数字) - 我想要东阿拉伯数字,例如“٢”。

我尝试

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

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

I have this C# code for example

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

Now the current thread is loading the Arabic culture. So the result is like this

???? 19, 2010

But i don't want the '2010' and the '19' to be in English (also known as Latin or West Arabic digits) - I want East Arabic numbers like "٢".

I tried

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

gave the same result.
So any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

困倦 2024-08-29 09:07:11

您可以使用此解决方法(只需列出您想要在字符串数组中使用此数字的所有文化):

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;
    }
}

然后使用该方法,对于您想要在其中包含“中心阿拉伯数字”的所有字符串,如下所示:

DateTime.Now.ToString().ConvertNumerals();

Thy this workaround (just list all cultures you want to use this numerals in the string array):

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;
    }
}

Then use the method, for all of your strings you want to have 'central Arabic numerals' in, like this:

DateTime.Now.ToString().ConvertNumerals();
放血 2024-08-29 09:07:11

作为一个快速测试,我写了这个来列出当年没有“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 框架中似乎没有内置任何内容。

As a quick test, I wrote this to list all the cutures which don't have "2010" in the year:

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

the results are:

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

To convert the numbers to Arabic text, it looks like this "NumToArabicString" project will do it. It doesn't look like there's anything built into the .net framework though.

人心善变 2024-08-29 09:07:11

唯一的解决办法是手动转换数字。

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

The only solution is to manually convert the digits.

You could use the CurrentCulture.NumberFormat.NativeDigits array instead of explicitly providing the Unicode characters to support any other languages in addition to the Arabic-Indic digits, but as far as builtin support by culture-aware classes such as DateTime it seems unimplemented or something.

圈圈圆圆圈圈 2024-08-29 09:07:11

试试这个:

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');
    }
}

Try this:

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');
    }
}
表情可笑 2024-08-29 09:07:11

我采取了 @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;
    }
}

我希望它有所帮助。

I've taken @Marcel B approach/workaround as I'm facing the same issue as the original question states.

In my case, it is for "ar-KW" Culture. The only difference is that I'm using the NumberFormat.NativeDigits which is already part of the CultureInfo.

You can check that like this (based on your current thread scenario):

Thread.CurrentThread.CurrentCulture.NumberFormat.NativeDigits

So, the code will look like this:

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;
    }
}

I hope it helps.

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

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

You can use the Windows.Globalization.NumberFormatting.NumeralSystemTranslator class to translate between the Latin and any of the supported numeral systems. To translate to Arabic, set the NumeralSystem property to "Arab", then you can call the TranslateNumerals method.

Alternatively you can just use Windows.Globalization.DateTimeFormatting.DateTimeFormatter class directly.

┼── 2024-08-29 09:07:11

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

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

输出:

٣٥٨٥٢ 

This is also an option to convert number 35852:

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

Outpus:

٣٥٨٥٢ 
2024-08-29 09:07:11

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

We use Arabic numerals in English. As such, what you're seeing is the correct - and only possible - behaviour.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文