我需要将出现在给定HTML页面中的所有英文数字转换为阿拉伯语数字(独立于用户浏览器编码)。我更喜欢使用javascript,如果可以使用CSS处理它会很棒。
我发现有些页面正在执行此操作,但我发现阿拉伯字母在源代码中添加了ASCII表示。这是否意味着他们正在应用某种java脚本函数?
任何线索我怎么能这样做?
答案 0 :(得分:34)
直接更换功能怎么样?
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
*/
答案 1 :(得分:11)
您需要使用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,因此从欧洲到印度数字的转换只是简单的数学。
答案 2 :(得分:7)
解释此评论:
在此链接almasry-alyoum.com中,当我查看此页面的来源时,我发现印度字母被放入其ascii表示中(即
٢٣٧
)
这些是HTML字符实体。这些值是由documentation定义的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
因此,0 1 2 3 4 5 6 7 8 9可以在网页中编码为٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩
。
注意:&#
表示十进制值;十六进制&#x
。
答案 3 :(得分:5)
感谢您的回答。没有人讨论过处理小数和千位标记。例如,请参阅Wikipedia。根据这个页面,这些是正确的unicode字符:
答案 4 :(得分:4)
将英语(拉丁)数字转换为波斯和阿拉伯数字。
//English to Persian digits.
String.prototype.toFa= function() {
return this.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
}
//English to Arabic digits.
String.prototype.toAr= function() {
return this.replace(/\d/g, d => '٠١٢٣٤٥٦٧٨٩'[d])
}
//English to either Persian or Arabic digits.
String.prototype.toIn= function(e) {
return this.replace(/\d/g, d => e ? '٠١٢٣٤٥٦٧٨٩'[d] : '۰۱۲۳۴۵۶۷۸۹'[d])
}
//English to Persian digits using unicode.
String.prototype.toFaUni= function() {
return this.replace(/\d/g, d => String.fromCharCode('0x06F'+d))
}
//English to Arabic digits using unicode.
String.prototype.toArUni= function() {
return this.replace(/\d/g, d => String.fromCharCode('0x066'+d))
}
//English to either Persian or Arabic digits.
String.prototype.toInUni= function(e) {
return this.replace(/\d/g, d => String.fromCharCode('0x06'+(e ? '6':'F')+d))
}
//examples
let text = 'It is 30/08/2018 at 8:24 AM'
//using array
alert(text.toFa())
alert(text.toAr())
alert(text.toIn(0))
alert(text.toIn(1))
//using unicode
alert(text.toFaUni())
alert(text.toArUni())
alert(text.toInUni(0))
alert(text.toInUni(1))
答案 5 :(得分:4)
我知道这是一篇非常老的文章,但是对于其他来自Google搜索的人来说,也有同样的问题,有一种相对较新的方法,称为toLocaleString,它将数字类型转换为您首选的数字系统字形: / p>
(2500000).toLocaleString('ar-EG');
//outputs: "٢٬٥٠٠٬٠٠٠"
答案 6 :(得分:1)
您所指的“ASCII等效物”实际上并不是 。
首先,ASCII是一种7位字符编码,其中不存在Arabic-Indic Digit Two之类的字符。
其次,你所看到的实际上是HTML Entities。要以编程方式将拉丁数字转换为这些实体,需要使用PHP,Perl,C#等后端语言。
第三,实体中表示的数值是十进制形式的Unicode代码点。所以2是代码点1634(十进制)或0662(十六进制)的Unicode字符,这是更标准的表示法。
最后,我喜欢ferdley的方法,但是棘手的部分将弄清楚如何使用他的算法来仅替换你想要的数字,而不是替换出现在HTML源中的数字,例如图像的像素宽度
答案 7 :(得分: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;
}
答案 8 :(得分:0)
编辑第一个答案,将英语数字转换为阿拉伯数字:
String.prototype.toArabicDigits = function(){
var id = ['٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
return this.replace(/[0-9]/g, function(w){
return id[+w];
});
};