我正在寻找将函数转换为阿拉伯语单词的JavaScript函数
例如
- 23> ثلاثةوعشرين
- 53> ثلاثةوخمسون
- ....> ....
我找到了一些解决方案,但它都是.net
我在网上搜索过但找不到任何解决方案(好吧,我用阿拉伯语搜索时无法理解;)
答案 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)
你可以使用类似的功能:
零到百万:
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, ' ');
}