如何使用简单的函数将波斯/阿拉伯数字转换为英文数字?
arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]
它是相同的模式,但代码页不同。
如何使用简单的函数将波斯/阿拉伯数字转换为英文数字?
arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]
它是相同的模式,但代码页不同。
var
persianNumbers = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g],
arabicNumbers = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g],
fixNumbers = function (str)
{
if(typeof str === 'string')
{
for(var i=0; i<10; i++)
{
str = str.replace(persianNumbers[i], i).replace(arabicNumbers[i], i);
}
}
return str;
};
请注意,在此代码中,波斯数字代码页与阿拉伯数字不同。
var mystr = 'Sample text ۱۱۱۵۱ and ٢٨٢٢';
mystr = fixNumbers(mystr);
英语、阿拉伯语和波斯语数字之间所有 6 种可能的翻译的Oneliner。
const e2p = s => s.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
const e2a = s => s.replace(/\d/g, d => '٠١٢٣٤٥٦٧٨٩'[d])
const p2e = s => s.replace(/[۰-۹]/g, d => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d))
const a2e = s => s.replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))
const p2a = s => s.replace(/[۰-۹]/g, d => '٠١٢٣٤٥٦٧٨٩'['۰۱۲۳۴۵۶۷۸۹'.indexOf(d)])
const a2p = s => s.replace(/[٠-٩]/g, d => '۰۱۲۳۴۵۶۷۸۹'['٠١٢٣٤٥٦٧٨٩'.indexOf(d)])
e2p("asdf1234") // asdf۱۲۳۴
e2a("asdf1234") // asdf١٢٣٤
p2e("asdf۱۲۳۴") // asdf1234
a2e("asdf١٢٣٤") // asdf1234
p2a("asdf۱۲۳۴") // asdf١٢٣٤
a2p("asdf١٢٣٤") // asdf۱۲۳۴
说明:
(s => f(s))(x)
是一个立即执行的 lambda 函数,将等于 f(x)s.replace(pattern, function)
在 s 中查找模式的匹配项,对于每个匹配项 m,它将替换function(m)
字符串中的m 。/\d/g
是一个正则表达式模式,\d
在英语中表示数字,g
表示全局。如果你没有指定g
它只会匹配第一次出现,否则它会匹配所有出现。d
字符串中的每个英文数字,该数字将被替换为'۰۱۲۳۴۵۶۷۸۹'[d]
so,3 将被替换为该列表('۰۱۲۳۴۵۶۷۸۹'
)中的第三个索引,即'۳'/[۰-۹]/g
是波斯数字的等效正则表达式,这次我们不能使用相同的方法,在我们利用 javascript 是动态类型并且 d 自动从字符串(正则表达式匹配)转换为数字(数组索引)这一事实之前(您可以'1234'['1']
在与 javascript 相同的 javascript 中执行'1234'[1]
)'1234'['۱']
无效。所以我们在这里使用一个技巧并使用indexOf
它是一个函数,它告诉我们数组中元素的索引(这里是字符串中的一个字符)所以,'۰۱۲۳۴۵۶۷۸۹'.indexOf(۳)
会给我们3
因为'۳'
是字符串中的第三个索引'۰۱۲۳۴۵۶۷۸۹'
这是一个简单的方法:
function toEnglishDigits(str) {
// convert persian digits [۰۱۲۳۴۵۶۷۸۹]
var e = '۰'.charCodeAt(0);
str = str.replace(/[۰-۹]/g, function(t) {
return t.charCodeAt(0) - e;
});
// convert arabic indic digits [٠١٢٣٤٥٦٧٨٩]
e = '٠'.charCodeAt(0);
str = str.replace(/[٠-٩]/g, function(t) {
return t.charCodeAt(0) - e;
});
return str;
}
一个例子:
console.log(toEnglishDigits("abc[0123456789][٠١٢٣٤٥٦٧٨٩][۰۱۲۳۴۵۶۷۸۹]"));
// expected result => abc[0123456789][0123456789][0123456789]
最好的方法是返回数组中数字的索引:
String.prototype.toEnglishDigits = function () {
return this.replace(/[۰-۹]/g, function (chr) {
var persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
return persian.indexOf(chr);
});
};
简短而轻松!
"۰۱۲۳۴۵۶۷۸۹".replace(/([۰-۹])/g, function(token) { return String.fromCharCode(token.charCodeAt(0) - 1728); });
或者以更现代的方式
"۰۱۲۳۴۵۶۷۸۹".replace(/([۰-۹])/g, token => String.fromCharCode(token.charCodeAt(0) - 1728));