20

我需要将出现在给定 HTML 页面中的所有英文数字转换为阿拉伯数字(独立于用户浏览器编码)。我更喜欢使用 javascript,或者如果可以使用 CSS 来处理,那就太好了。

我发现一些页面这样做,但我发现阿拉伯字母在源代码中添加了它们的 ASCII 表示。这是否意味着他们正在应用某种 java 脚本函数?

任何线索我怎么能做这样的事情?

4

9 回答 9

46

直接替换功能怎么样?

String.prototype.toIndiaDigits= function(){
 var id= ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
 return this.replace(/[0-9]/g, function(w){
  return id[+w]
 });
}

// test

var S='The year 2009 has only 365 days';
alert(S.toIndiaDigits());

/*  returned value: (String)
The year ۲۰۰۹ has only ۳۶۵ days
*/
于 2009-11-04T19:14:22.653 回答
12

您将需要使用 JavaScript,但过程非常简单。假设您要转换的数字已经在一个字符串中,那么类似下面的代码片段将起作用:

function convertDigitIn(enDigit){ // PERSIAN, ARABIC, URDO
    var newValue="";
    for (var i=0;i<enDigit.length;i++)
    {
        var ch=enDigit.charCodeAt(i);
        if (ch>=48 && ch<=57)
        {
            // european digit range
            var newChar=ch+1584;
            newValue=newValue+String.fromCharCode(newChar);
        }
        else
            newValue=newValue+String.fromCharCode(ch);
    }
    return newValue;
}

代码不是很漂亮,可能可以更有效地编写,但本质上它所做的是通过添加偏移值将任何字符从“0”转换为“9”,以使字符值现在在 unicode 范围内印度数字。印度数字的范围从 \u0660 到 \u0669 因此从欧洲数字到印度数字的转换只是简单的数学运算。

于 2009-11-04T19:03:19.610 回答
9

转换英语 <> 阿拉伯语 <> 波斯语

//English to Persian digits.
String.prototype.EntoFa= function() {
  return this.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
}

//English to Arabic digits.
String.prototype.EntoAr= function() {
  return this.replace(/\d/g, d =>  '٠١٢٣٤٥٦٧٨٩'[d])
}

//Arabic to English digits.
String.prototype.ArtoEn= function() {
  return this.replace(/[\u0660-\u0669]/g, 
    d => d.charCodeAt() - 1632)
}

//Persian to English digits.
String.prototype.PetoEn= function() {
  return this.replace(/[\u06F0-\u06F9]/g, 
    d => d.charCodeAt() - 1776)
}

//Persian to Arabic digits.
String.prototype.PetoAr= function() {
  return this.replace(/[\u06F0-\u06F9]/g, 
    d => '٠١٢٣٤٥٦٧٨٩'[d.charCodeAt() - 1776])
}

//Arabic to Persian digits.
String.prototype.ArtoPe= function() {
  return this.replace(/[\u0660-\u0669]/g, 
    d => '۰۱۲۳۴۵۶۷۸۹'[d.charCodeAt() - 1632])
}

//Both Persian and Arabic to English digits.
String.prototype.IntoEn= function() {
  return this.replace(/[\u06F0-\u06F9\u0660-\u0669]/g, 
    d => ((c=d.charCodeAt()) > 1775 ? c - 1776 : c - 1632))
}

//English to either Persian or Arabic digits.
String.prototype.EntoIn= function(e) {
  return this.replace(/\d/g, 
    d => e ? '٠١٢٣٤٥٦٧٨٩'[d] : '۰۱۲۳۴۵۶۷۸۹'[d])
}

//English to Persian digits using unicode.
String.prototype.EntoFaUni= function() {
  return this.replace(/\d/g, d => String.fromCharCode('0x06F'+d))
}

//English to Arabic digits using unicode.
String.prototype.EntoArUni= function() {
  return this.replace(/\d/g, d => String.fromCharCode('0x066'+d))
}

//English to either Persian or Arabic digits.
String.prototype.EntoInUni= function(e) {
  return this.replace(/\d/g, d => String.fromCharCode('0x06'+(e ? '6':'F')+d))
}

//examples
let En = 'It is 30/08/2018 at 8:24 AM'
let Pe = 'It is ۳۰/۰۸/۲۰۱۹ at ۸:۲۴ AM'
let Ar = 'It is ٣٠/٠٨/٢٠١٩ at ٨:٢٤ AM'

let PeAr = 'It is ۳۰/۰۸/۲۰۱۹ at ۸:۲۴ | AM It is ٣٠/٠٨/٢٠١٩ at ٨:٢٤ AM'

//Persian <> Araibc <> English

alert(Ar.ArtoEn())
alert(Pe.PetoEn())
alert(Pe.PetoAr())
alert(Ar.ArtoPe())
alert(PeAr.IntoEn())

//using array
alert(En.EntoFa())
alert(En.EntoAr())
alert(En.EntoIn(0))
alert(En.EntoIn(1))

//using unicode
alert(En.EntoFaUni())
alert(En.EntoArUni())
alert(En.EntoInUni(0))
alert(En.EntoInUni(1)) 

jsfiddle

于 2018-08-30T03:58:21.347 回答
8

要解释此评论:

就像在这个链接 almasry-alyoum.com 中一样,当我查看此页面的来源时,我发现印度字母被放在了它们的 ascii 表示中(即&#1634;&#1635;&#1639;

这些是 HTML 字符实体。这些值是文档定义的 Unicode 代码点。

0660 ARABIC-INDIC DIGIT ZERO
0661 ARABIC-INDIC DIGIT ONE
0662 ARABIC-INDIC DIGIT TWO
0663 ARABIC-INDIC DIGIT THREE
0664 ARABIC-INDIC DIGIT FOUR
0665 ARABIC-INDIC DIGIT FIVE
0666 ARABIC-INDIC DIGIT SIX
0667 ARABIC-INDIC DIGIT SEVEN
0668 ARABIC-INDIC DIGIT EIGHT
0669 ARABIC-INDIC DIGIT NINE

因此,٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ 可以被编码为&#x0660; &#x0661; &#x0662; &#x0663; &#x0664; &#x0665; &#x0666; &#x0667; &#x0668; &#x0669;网页。

注:&#为十进制值;&#x为十六进制。

于 2009-11-04T19:13:30.143 回答
8

我知道这是一篇很老的帖子,但对于从谷歌搜索而来的其他人来说,有同样的问题,有一个相对较新的方法叫做toLocaleString它将数字类型转换为你喜欢的数字系统字形:

(2500000).toLocaleString('ar-EG');
//outputs: "٢٬٥٠٠٬٠٠٠"

于 2020-01-12T02:54:57.733 回答
5

Thanks for the answers. No one has discussed handling decimal and thousand markers. See Wikipedia for example. According to this page, these are the correct unicode characters:

  • U+066B - Arabic Decimal Separator
  • U+066C - Arabic Thousands Separator
于 2011-02-15T09:39:33.020 回答
2

编辑第一个答案,将英文数字转换为阿拉伯数字:

String.prototype.toArabicDigits = function(){
var id = ['٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
return this.replace(/[0-9]/g, function(w){
  return id[+w];
 });
};
于 2019-06-17T22:55:22.203 回答
1

您所指的“ASCII 等价物”实际上根本不是那个

首先,ASCII 是一种 7 位字符编码,其中不存在像阿拉伯印度数字二这样的字符。

其次,您看到的实际上是HTML 实体。要以编程方式将拉丁数字转换为这些实体,需要使用 PHP、Perl、C# 等后端语言。

第三,实体中表示的数值是十进制形式的Unicode代码点。所以 ٢ 是代码点 1634(十进制)或 0662(十六进制)处的 Unicode 字符,这是更标准的表示法。

最后,我喜欢 ferdley 的方法,但棘手的部分是弄清楚如何使用他的算法只替换您想要的数字,而不是 HTML 源代码中出现的数字,例如图像的像素宽度。

于 2009-11-04T19:12:54.350 回答
1

给这个 JavaScript 函数一个字符串数字,它将帮助您将英语转换为阿拉伯语

function GetArabicNumber(number) {
            var charIndex = 0;
            var NumericArabic = "";

            while (charIndex < number.length) {
                switch (number[(charIndex)]) {
                    case '.':
                        NumericArabic += ".";
                        break;

                    case '0':
                        NumericArabic += "٠";
                        break;

                    case '1':
                        NumericArabic += "١";
                        break;

                    case '2':
                        NumericArabic += "٢";
                        break;

                    case '3':
                        NumericArabic += "٣";
                        break;

                    case '4':
                        NumericArabic += "٤";
                        break;

                    case '5':
                        NumericArabic += "٥";
                        break;

                    case '6':
                        NumericArabic += "٦";
                        break;

                    case '7':
                        NumericArabic += "٧";
                        break;

                    case '8':
                        NumericArabic += "٨";
                        break;

                    case '9':
                        NumericArabic += "٩";
                        break;

                    default:
                        NumericArabic += number[(charIndex)];
                        break;
                }

                charIndex++;
            }

            return NumericArabic;
        }
于 2020-05-29T16:20:07.283 回答