如何在ASP.NET MVC页面上显示波斯数字?

时间:2011-02-23 19:33:09

标签: asp.net-mvc date-format persian money-format

我正在建立一个需要支持英语和波斯语的网站。该站点使用ASP.NET MVC 3和.NET 4(C#)构建。我的所有控制器都继承自BaseController,它将文化设置为“fa-IR”(在测试期间):

Thread.CurrentThread.CurrentCulture = new CultureInfo("fa-IR");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fa-IR");

在我的视图中,我正在使用静态帮助程序类转换为正确的时区并格式化日期。像:

DateFormatter.ToLocalDateAndTime(model.CreatedOnUtc)

我用MoneyFormatter做同样的钱。为了钱,这种货币在波斯语中正确打印(或者,至少我认为是因为我不知道任何波斯语。稍后我们的翻译将对其进行验证)。日期也是如此,月份正确打印。这是它目前显示的内容:

为了钱:

قیمت: ريال 1,000 

日期:

21:01 ديسمبر 3

在这些例子中,我希望数字也用波斯语打印。你是如何做到的?

我也尝试过添加:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1256" />
在某些论坛上推荐的HEAD标签中的

。虽然没有改变任何东西(从我能看到的)。我还在我的浏览器语言(IE和Firefox)中添加了“fa-IR”作为第一种语言。也没有帮助。

有人对如何解决这个问题有任何想法吗?如果可能的话,我宁愿避免在英文数字和波斯数字之间创建翻译表。

最好的问候,
埃里克

4 个答案:

答案 0 :(得分:3)

经过一些进一步的研究后,我找到了一位微软员工的回答,声称他们没有翻译数字,尽管完全有可能使用NativeDigits属性提供的特定文化的数字数组(见http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.nativedigits.aspx)。

要查明表单中提交的文字是阿拉伯语还是拉丁文,我现在正在做:

public bool IsContentArabic(string content)
{
    string pattern = @"\p{IsArabic}";
    return Regex.IsMatch(
        content, 
        pattern, 
        RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline);
}

public bool IsContentLatin1(string content)
{
    string pattern = @"\p{IsBasicLatin}";
    return Regex.IsMatch(
        content, 
        pattern, 
        RegexOptions.IgnoreCase | RegexOptions.Multiline);
 }

为了将波斯数字转换为“拉丁”等价物,我写了这个帮手:

public static class NumberHelper
{
    private static readonly CultureInfo arabic = new CultureInfo("fa-IR");
    private static readonly CultureInfo latin = new CultureInfo("en-US");

    public static string ToArabic(string input)
    {
        var arabicDigits = arabic.NumberFormat.NativeDigits;
        for (int i = 0; i < arabicDigits.Length; i++)
        {
           input = input.Replace(i.ToString(), arabicDigits[i]);
        }
        return input;
    }

    public static string ToLatin(string input)
    {
        var latinDigits = latin.NumberFormat.NativeDigits;
        var arabicDigits = arabic.NumberFormat.NativeDigits;
        for (int i = 0; i < latinDigits.Length; i++)
        {
            input = input.Replace(arabicDigits[i], latinDigits[i]);
        }
        return input;
    }
}

我还在模型绑定发生之前就已经上钩了,如果适用,我会将表格中的数字输入转换为拉丁数字。

Ako,我们设法在我们的网页的html标签上使用'dir'属性(dir =&gt;方向)解决了很多问题。像这样:

<html dir="rtl">

'dir'属性采用“rtl”(从右到左)或“ltr”(从左到右)。

希望这有助于某人!

答案 1 :(得分:1)

也许你必须改变字体。 如果您知道您的客户端支持特定字体,比如说Badr或Nazanin,那么您可以更改这些数字的字体系列,我认为这对您有用。

您可以提供页面的字体,但我认为这只适用于现代浏览器,而旧版本则无效。你可以check这个 希望有所帮助。

答案 2 :(得分:0)

如何将数字打印到输出?我没有太多的本地化经验,但您可能必须使用适当的NumberFormatInfo或类似的东西来格式化数字。

同样为了获得最大的可移植性,您应该使用UTF8作为编码。

答案 3 :(得分:0)

你应该使用支持波斯语号 font-face 。 我使用这种技术,我可以在我的网站上显示波斯语号码。 字体如:BNazanin。