使用javascript将阿拉伯数字转换为单词

时间:2014-07-06 09:38:40

标签: javascript converter

我正在寻找将函数转换为阿拉伯语单词的JavaScript函数

例如

  
      
  • 23> ثلاثةوعشرين
  •   
  • 53> ثلاثةوخمسون
  •   
  • ....> ....
  •   

我找到了一些解决方案,但它都是.net

我在网上搜索过但找不到任何解决方案(好吧,我用阿拉伯语搜索时无法理解;)

4 个答案:

答案 0 :(得分:2)

这个答案迟了两年,但是......

这个问题的所有答案都假设阿拉伯数字的工作方式与英语相同。 不幸的是,事实并非如此。阿拉伯语句子结构比英语句子结构更强,更多更复杂,用于数字的单词根据您所计算的是男性对象还是女性对象(阿拉伯语中的对象,如法语,有性别),并根据句子中计数对象的位置(无论是主语,对象,介词后等)。

对于مرفوعين的阳性对象(مذكر),你可以使用我刚写的这个片段,因为我无法在任何地方找到这个问题的答案。 它适用于少于100万的数字,并且不适用于浮点之后(尚未)。

var P = {
  l : ['صفر', ' ألف'],
  unis : ['', 'واحد', 'اثنين', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة'],
  tens : ['', 'عشرة', 'عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون'],
 xtens : ['عشرة', 'أحد عشر', 'اثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر'],
  huns : ['', 'مائة', 'مئتان', 'ثلاث مائة', 'اربع مائة', 'خمس مائة', 'ست مائة', 'سبع مائة', 'ثمان مائة', 'تسع مائة'],
  thos : ['', 'ألف', 'ألفان', 'ثلاثة ألاف', 'اربعة ألاف', 'خمسة ألاف', 'ستة ألاف', 'سبعة ألاف', 'ثمانية ألاف', 'تسعة ألاف'],
 xthos : ['عشرة ألاف', 'أحد عشر ألف', 'اثنا عشر ألف', 'ثلاثة عشر ألف', 'أربعة عشر ألف', 'خمسة عشر ألف', 'ستة عشر ألف', 'سبعة عشر ألف', 'ثمانية عشر ألف', 'تسعة عشر ألف'],
   and : 'و',
};
var N = '٠١٢٣٤٥٦٧٨٩';
function replaceNumerals(s){
  if(!(/[٠١٢٣٤٥٦٧٨٩]+/).test(s))return s;
  let t = typeof(s);
  s = s.split('').map((o)=>{
    if(N.indexOf(o) != -1)
      return N.indexOf(o);
    return o;
  }).join('');
  return t=="number"?~~s:s;
}
function pounds(y) {
    y = replaceNumerals(y);
    s = y.toString().replace(/[\, ]/g, '');
    if (s != parseFloat(s)) return false;
    var x = s.indexOf('.');x = x==-1?s.length:x;
    if (x > 6 || s.length - x > 2) return false;
    y = parseFloat(s);
    d = y - ~~y;
    y = ~~y;
    if(!y)return P.l[0];
    let str = [], r, v = 0, p, c = ~~y%10, n, i = 1;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;
    do {
      //Units
      if(c > 0)str.push(P.unis[c]);
      if(n===undefined)break;p = c;c = n;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;v += p*Math.pow(10,i-3);
      //Tens
      if(c == 1)str[0] = P.xtens[p];
      if(c > 1){
        if(v > 0)str.unshift(P.and);
        str.unshift(P.tens[c]);
      }
      if(n===undefined)break;p = c;c = n;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;v += p*Math.pow(10,i-3);
      //Hundreds
      if(v > 0 && c > 0)str.push(P.and);
      if(c > 0)str.push(P.huns[c]);
      if(n===undefined)break;p = c;c = n;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;v += p*Math.pow(10,i-3);
      //Thousands
      if(v > 0 && c > 0 && !n)str.push(P.and);
      if(c > 0 && !n)str.push(P.thos[c]);
      if(n===undefined)break;p = c;c = n;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;v += p*Math.pow(10,i-3);
      //Ten Thousands
      if(v > 0 && c > 0 && y - c*1e4 - p*1e3 > 0)str.push(P.and);
      if(c == 1)str.push(P.xthos[p]);
      if(c > 1){
        str.push(P.l[1]);
        str.push(P.tens[c]);
        if(p > 0){
          str.push(P.and);
          str.push(P.unis[p]);
        }
      }
      if(n===undefined)break;p += 10*c;c = n;n = (r=~~(y/Math.pow(10,i++)))?r%10:undefined;v += p*Math.pow(10,i-3);
      //Hundred Thousands
      if(v > 0 && c > 0)str.push(P.and);
      if(c > 0){
        if(!p)str.push(P.l[1]);
        str.push(P.huns[c]);
      }
    } while(false);
    return str.reverse().join(' ');
}

它可能比这更精致,但是,考虑到语言规则不像英语那样统一,用循环(就像你用英语一样)这样做会在我看来非常适得其反。 / p>

答案 1 :(得分:2)

我为此检查编写了一个NPM包: https://github.com/mmahgoub/tafgeetjs

$npm install tafgeetjs

使用方法: var Tafgeet = require('tafgeetjs');

var stringText = new Tafgeet(556563.20, 'SDG').parse();

这将产生:'فقطخمسمائةوستةوخمسونألفوخمسمائةوثلاثةوستونجنيهسودانيوعشرونقرشلاغير'。

也有一个Angular例子。

答案 2 :(得分:1)

你可以使用类似的功能:

http://jsbin.com/jesoj/1/

零到百万:

function zeroToMillion(num) {
    num = (num + "").replace(" ", "");
    var exceptional = {0: "zero", 11: "eleven", 12: "twelve",
                       13: "thirteen", 14: "fourteen", 15: "fifteen",
                       16: "sixteen", 17: "seventeen", 18: "eighteen",
                       19: "nineteen"};

    var digit = ["", "one", "two", "three", "four", "five", "six",
                 "seven", "eight", "nine"]; // don't add zero
    var decade = ["", "ten", "twenty", "thirty", "forty", "fifty",
                  "sixty", "seventy", "eighty", "ninety"]; // don't add zero

    var largenumber = ["hundred", "thousand", "million", "billion"];

    var l = num.length-1,
        a = (num[l]) ? num[l] : 0,
        b = (num[l-1]) ? num[l-1] : 0,
        ba = ""+b+a,
        c = (num[l-2]) ? num[l-2] : 0,
        d = (num[l-3]) ? num[l-3] : 0,
        e = (num[l-4]) ? num[l-4] : 0,
        ed = ""+e+d,
        f = (num[l-5]) ? num[l-5] : 0,
        num_ab = (exceptional[ba]) ? exceptional[ba] : (decade[b]+" "+digit[a]),
        num_ed = (exceptional[ed]) ? exceptional[ed] : (decade[e]+" "+digit[d]),
        name_c = (c!==0) ? (digit[c]+" "+largenumber[0])+" " : "",
        name_d = (num_ed!==" ") ? (num_ed+" "+largenumber[1])+" " : "",
        name_f = (f!==0) ? (digit[f]+" "+largenumber[0])+" " : "";
    return name_f+name_d+name_c+num_ab;
}

零到一百:

function zeroToHundred(num) {
    num = num+""; // .toString();
    var exceptional = {0: "zero", 11: "eleven", 12: "twelve",
                       13: "thirteen", 14: "fourteen", 15: "fifteen",
                       16: "sixteen", 17: "seventeen", 18: "eighteen",
                       19: "nineteen", 100: "one hundred"};

    var digit = ["", "one", "two", "three", "four", "five", "six",
                 "seven", "eight", "nine"]; // don't add zero
    var decade = ["", "ten", "twenty", "thirty", "forty", "fifty",
                  "sixty", "seventy", "eighty", "ninety"]; // don't add zero

    if (exceptional[num]) {
        return exceptional[num];
    } else {
        var b = (num[1]) ? num[1] : num[0],
            a = (num[1]) ? num[0] : 0;
        return decade[a]+" "+digit[b];
    }
}

好翻译。

答案 3 :(得分:0)

正如建议的正确答案如下,(阿拉伯语,请更正!):

// Convert numbers to words

var th = ['', 'ألف', 'مليون', 'مليار', 'تريليون'];
var dg =  ['صفر', 'واحد', 'اثنين', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة'];
var tn = ['عشرة', 'أحد عشر', 'اثني عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر'];
var tw =  ['العشرين', 'ثلاثون', 'الأربعين', 'خمسين', 'ستين', 'السبعين', 'ثمانين', 'تسعين'];

function convertNumberToString(s) {
    s = s.toString();
    s = s.replace(/[\, ]/g, '');
    if (s != parseFloat(s)) return 'لیس عدد';
    var x = s.indexOf('.');
    if (x == -1) x = s.length;
    if (x > 15) return 'كبير جدا';
    var n = s.split('');
    var str = '';
    var sk = 0;
    for (var i = 0; i < x; i++) {
        if ((x - i) % 3 == 2) {
            if (n[i] == '1') {
                str += tn[Number(n[i + 1])] + ' ';
                i++;
                sk = 1;
            } else if (n[i] != 0) {
                str += tw[n[i] - 2] + ' ';
                sk = 1;
            }
        } else if (n[i] != 0) {
            str += dg[n[i]] + ' ';
            if ((x - i) % 3 == 0) str += 'مائة ';
            sk = 1;
        }
        if ((x - i) % 3 == 1) {
            if (sk) str += th[(x - i - 1) / 3] + ' ';
            sk = 0;
        }
    }
    if (x != s.length) {
        var y = s.length;
        str += 'نقطة ';
        for (var i = x + 1; i < y; i++) str += dg[n[i]] + ' ';
    }
    return str.replace(/\s+/g, ' ');
}