如何使用 JavaScript 将字符串的波斯语和阿拉伯语数字转换为英语?

IT技术 javascript arabic farsi
2021-02-23 08:19:58

如何使用简单的函数将波斯/阿拉伯数字转换为英文数字?

arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]

它是相同的模式,但代码页不同。

6个回答

使用这个简单的函数来转换你的字符串

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因为'۳'是字符串中的第三个索引'۰۱۲۳۴۵۶۷۸۹'
@mohammadjawadBarati 它们以相同的顺序输入(0 前,9 后)但 stackoverflow 中的渲染有问题。
2021-04-27 08:19:58
我爱上了这个解决方案!
2021-04-29 08:19:58
谢谢你的解释:)
2021-04-30 08:19:58
问题说,波斯数字转英文!
2021-05-04 08:19:58
这是最好的答案!你能不能解释一下它是如何工作的。
2021-05-06 08:19:58

这是一个简单的方法:

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]
很好地接近我的朋友
2021-05-09 08:19:58

最好的方法是返回数组中数字的索引:

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));
这个解决方案是最好的,因为它没有打字问题并且最适合typescript。谢谢
2021-05-14 08:19:58