使用 Javascript 将运算符(+、-、*、/)应用于东方阿拉伯数字

Apply operators (+, -, *, /) to Eastern Arabic numbers using Javascript

关于如何将东方阿拉伯数字 (٠١٢٣٤٥٦٧٨) 转换为西方阿拉伯数字 (01234567) 以及反之的答案很多。

但是,有没有办法对东方阿拉伯数字应用数学运算符。 我正在寻找类似以下内容的内容:

'١٢٣'+'١١٢'==235
'١٢٣'-'١١٢'==-11
'٢'*'٣'==6
 '١'==='٢'   //false

您可以扩展 Number class 并覆盖 valueOf 方法(基于 ES6 的解决方案)

class EANum extends Number{
     constructor(){
         super();
         this.value=arguments[0];
     }
    valueOf(){
       return  Number( this.value.replace(/[٠١٢٣٤٥٦٧٨٩]/g,(d)=> d.charCodeAt(0) - 1632).replace(/[۰۱۲۳۴۵۶۷۸۹]/g, (d)=> d.charCodeAt(0) - 1776));
    }
    toString(){
       return this.valueOf();
    }

}

var a=new EANum('٣٤'),b=new EANum('١١');
console.log(a); // 
console.log(a+b); //45
console.log(a-b); //23
console.log(a*b); //374

你也可以使用这个简单的方法。但是,如果无法控制输入,它将受到不受信任的代码注入的影响。

function evalArabic(expr) {
  var fn = new Function(
    'return (' + expr.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function(c) {
      return c.charCodeAt(0) - 0x660;
    }) + ')'
  );  
  return fn();
}

console.log(evalArabic('١٢٣ + ١١٢'));
console.log(evalArabic('١٢٣ - ١١٢'));
console.log(evalArabic('٢ * ٣'));
console.log(evalArabic('١ === ٢'));

// this one is bad:
// console.log(evalArabic('alert("p4wn3d! lol")'));