JavaGeek
JavaGeek

Reputation: 1539

Convert English Numbers to Arabic Text using Javascript

I want to give the input as 2019 in english and it should be converted to Arabic text like ألفين و تسعة عشر

Also i dont want to use any external library and looking for Native Javascript

Upvotes: 1

Views: 1538

Answers (2)

codeforbetter
codeforbetter

Reputation: 16

Here is the solution

String.prototype.toArabic= function() {
    return this.replace(/\d/g, d =>  '٠١٢٣٤٥٦٧٨٩'[d])
}

//English to Arabic using unicode
String.prototype.toArabicUni= function() {
    return this.replace(/\d/g, d => String.fromCharCode('0x066'+d))
}

let dummyText = 'Today date 22/08/2019 at 4:24 PM'

alert(dummyText.toArabic());
alert(dummyText.toArabicUni());

Upvotes: 0

Mohsen Alyafei
Mohsen Alyafei

Reputation: 5567

If you are looking for a native Javascript (non-library) function to convert English Numbers to Arabic Text using Javascript with proper Arabic Grammer, then you can try my following function code.

It will convert numbers to Arabic Text using the 'Masculine' (male) form. And will also put the right tanween at the right places.

I have included test cases for testing.

Examples:

console.log(numToWordsAR_M(10));
console.log(numToWordsAR_M(22));
console.log(numToWordsAR_M(818));
console.log(numToWordsAR_M(2022));

// outputs:

عشرة
اثنان وعشرون
ثمانمائة وثمانية عشر
ألفان واثنان وعشرون

/*********************************************************************
* @function      : numToWordsAR_M(Number)
* @purpose       : Converts Whole Numbers (without fractions) Masculine to Arabic Text
* @version       : 2.00
* @author        : Mohsen Alyafei
* @date          : 27 Feb 2022
* @Licence       : MIT
* @param         : {Number} [Integer in Numeric or String form]
* @returns       : {string} The wordified number string in Arabic.
**********************************************************************/
function numToWordsAR_M(num=0) {
if(num==0)return"صفر";
let n,N,o="",l=false,W=" و",m="مائة",L=(num="0".repeat((num+="").length*2%3)+num).length,
S=[,"ألف","مليون","مليار","ترليون","كوادرليون"],
T=["","واحد","اثنان","ثلاثة","أربعة","خمسة","ستة","سبعة","ثمانية","تسعة","عشرة"];
for(let D=L;D>0;D-=3){n=+num.substring(L-D,L-D+3);l=!+num.substring(L-D+3);n&&(o+=$(D/3-1),l||(o+=""+W));}
return o;
function $(P){let s=S[P],h=~~(n/100),u=(N=n%100)%10,t=~~(N/10),H="",wN="";
if(h){if(h>2)H=T[h].slice(0,(h==8?-2:-1))+m;
else if(h==1)H=m;else H=m.slice(0,-1)+(s&&!N?"تا":"تان");}
if(N>19)wN=T[u]+(u?W:"")+(t==2?"عشر":T[t].slice(0,(t==8?-2:-1)))+"ون";
else if(N>10)wN=(u==1?"أحد":(u==2?"اثنا":T[u]))+" عشر";
else if(N>2||!N)wN=T[N];else wN=T[N];let w=H+(h&&N?W:"")+wN;
if(!s)return w;if(N>2)return w+" "+(N>10?s+"ًا":(P<3?[,"آلاف","ملايين"][P]:S[P]+"ات"));
if(!N)return w+" "+s;w=(h?H+W:"")+s;return(N==1)?w:w+"ان";}}
//=========================================================









var r=0; // test tracker
r |= test("","صفر");
r |= test(0,"صفر");
r |= test(1,"واحد");
r |= test(2,"اثنان");
r |= test(3,"ثلاثة");
r |= test(4,"أربعة");
r |= test(5,"خمسة");
r |= test(6,"ستة");
r |= test(7,"سبعة");
r |= test(8,"ثمانية");
r |= test(9,"تسعة");
r |= test(10,"عشرة");
r |= test(11,"أحد عشر");
r |= test(12,"اثنا عشر");
r |= test(13,"ثلاثة عشر");
r |= test(14,"أربعة عشر");
r |= test(15,"خمسة عشر");
r |= test(16,"ستة عشر");
r |= test(17,"سبعة عشر");
r |= test(18,"ثمانية عشر");
r |= test(19,"تسعة عشر");
r |= test(20,"عشرون");
r |= test(21,"واحد وعشرون");
r |= test(22,"اثنان وعشرون");
r |= test(23,"ثلاثة وعشرون");
r |= test(30,"ثلاثون");
r |= test(31,"واحد وثلاثون");
r |= test(32,"اثنان وثلاثون");
r |= test(33,"ثلاثة وثلاثون");
r |= test(40,"أربعون");
r |= test(41,"واحد وأربعون");
r |= test(42,"اثنان وأربعون");
r |= test(43,"ثلاثة وأربعون");
r |= test(99,"تسعة وتسعون");
r |= test(100,"مائة");
r |= test(101,"مائة وواحد");
r |= test(102,"مائة واثنان");
r |= test(103,"مائة وثلاثة");
r |= test(104,"مائة وأربعة");
r |= test(105,"مائة وخمسة");
r |= test(106,"مائة وستة");
r |= test(107,"مائة وسبعة");
r |= test(108,"مائة وثمانية");
r |= test(109,"مائة وتسعة");
r |= test(110,"مائة وعشرة");
r |= test(111,"مائة وأحد عشر");
r |= test(112,"مائة واثنا عشر");
r |= test(113,"مائة وثلاثة عشر");
r |= test(120,"مائة وعشرون");
r |= test(121,"مائة وواحد وعشرون");
r |= test(122,"مائة واثنان وعشرون");
r |= test(123,"مائة وثلاثة وعشرون");
r |= test(130,"مائة وثلاثون");
r |= test(131,"مائة وواحد وثلاثون");
r |= test(132,"مائة واثنان وثلاثون");
r |= test(133,"مائة وثلاثة وثلاثون");
r |= test(140,"مائة وأربعون");
r |= test(150,"مائة وخمسون");
r |= test(199,"مائة وتسعة وتسعون");
r |= test(200,"مائتان");
r |= test(201,"مائتان وواحد");
r |= test(202,"مائتان واثنان");
r |= test(203,"مائتان وثلاثة");
r |= test(204,"مائتان وأربعة");
r |= test(205,"مائتان وخمسة");
r |= test(206,"مائتان وستة");
r |= test(207,"مائتان وسبعة");
r |= test(208,"مائتان وثمانية");
r |= test(209,"مائتان وتسعة");
r |= test(210,"مائتان وعشرة");
r |= test(211,"مائتان وأحد عشر");
r |= test(212,"مائتان واثنا عشر");
r |= test(213,"مائتان وثلاثة عشر");
r |= test(220,"مائتان وعشرون");
r |= test(221,"مائتان وواحد وعشرون");
r |= test(222,"مائتان واثنان وعشرون");
r |= test(223,"مائتان وثلاثة وعشرون");
r |= test(230,"مائتان وثلاثون");
r |= test(231,"مائتان وواحد وثلاثون");
r |= test(232,"مائتان واثنان وثلاثون");
r |= test(233,"مائتان وثلاثة وثلاثون");
r |= test(299,"مائتان وتسعة وتسعون");
r |= test(300,"ثلاثمائة");
r |= test(301,"ثلاثمائة وواحد");
r |= test(302,"ثلاثمائة واثنان");
r |= test(303,"ثلاثمائة وثلاثة");
r |= test(310,"ثلاثمائة وعشرة");
r |= test(311,"ثلاثمائة وأحد عشر");
r |= test(312,"ثلاثمائة واثنا عشر");
r |= test(313,"ثلاثمائة وثلاثة عشر");
r |= test(320,"ثلاثمائة وعشرون");
r |= test(321,"ثلاثمائة وواحد وعشرون");
r |= test(322,"ثلاثمائة واثنان وعشرون");
r |= test(323,"ثلاثمائة وثلاثة وعشرون");
r |= test(330,"ثلاثمائة وثلاثون");
r |= test(331,"ثلاثمائة وواحد وثلاثون");
r |= test(332,"ثلاثمائة واثنان وثلاثون");
r |= test(333,"ثلاثمائة وثلاثة وثلاثون");
r |= test(340,"ثلاثمائة وأربعون");
r |= test(400,"أربعمائة");
r |= test(500,"خمسمائة");
r |= test(600,"ستمائة");
r |= test(838,"ثمانمائة وثمانية وثلاثون");
r |= test(999,"تسعمائة وتسعة وتسعون");
r |= test(1000,"ألف");
r |= test(2000,"ألفان");
r |= test(2001,"ألفان وواحد");
r |= test(2002,"ألفان واثنان");
r |= test(2003,"ألفان وثلاثة");
r |= test(2011,"ألفان وأحد عشر");
r |= test(2022,"ألفان واثنان وعشرون");
r |= test(2100,"ألفان ومائة");
r |= test(2200,"ألفان ومائتان");
r |= test(2300,"ألفان وثلاثمائة");
r |= test(3001,"ثلاثة آلاف وواحد");
r |= test(3002,"ثلاثة آلاف واثنان");
r |= test(3003,"ثلاثة آلاف وثلاثة");
r |= test(3011,"ثلاثة آلاف وأحد عشر");
r |= test(3022,"ثلاثة آلاف واثنان وعشرون");
r |= test(3100,"ثلاثة آلاف ومائة");
r |= test(3200,"ثلاثة آلاف ومائتان");
r |= test(3300,"ثلاثة آلاف وثلاثمائة");
r |= test(4001,"أربعة آلاف وواحد");
r |= test(4002,"أربعة آلاف واثنان");
r |= test(10001,"عشرة آلاف وواحد");
r |= test(10002,"عشرة آلاف واثنان");
r |= test(10003,"عشرة آلاف وثلاثة");
r |= test(10011,"عشرة آلاف وأحد عشر");
r |= test(10022,"عشرة آلاف واثنان وعشرون");
r |= test(10100,"عشرة آلاف ومائة");
r |= test(10200,"عشرة آلاف ومائتان");
r |= test(10300,"عشرة آلاف وثلاثمائة");
r |= test(11001,"أحد عشر ألفًا وواحد");
r |= test(11002,"أحد عشر ألفًا واثنان");
r |= test(11003,"أحد عشر ألفًا وثلاثة");
r |= test(11011,"أحد عشر ألفًا وأحد عشر");
r |= test(11022,"أحد عشر ألفًا واثنان وعشرون");
r |= test(11100,"أحد عشر ألفًا ومائة");
r |= test(11200,"أحد عشر ألفًا ومائتان");
r |= test(11300,"أحد عشر ألفًا وثلاثمائة");
r |= test(12001,"اثنا عشر ألفًا وواحد");
r |= test(12002,"اثنا عشر ألفًا واثنان");
r |= test(12003,"اثنا عشر ألفًا وثلاثة");
r |= test(12011,"اثنا عشر ألفًا وأحد عشر");
r |= test(12022,"اثنا عشر ألفًا واثنان وعشرون");
r |= test(12100,"اثنا عشر ألفًا ومائة");
r |= test(12200,"اثنا عشر ألفًا ومائتان");
r |= test(12300,"اثنا عشر ألفًا وثلاثمائة");
r |= test(13001,"ثلاثة عشر ألفًا وواحد");
r |= test(13002,"ثلاثة عشر ألفًا واثنان");
r |= test(13003,"ثلاثة عشر ألفًا وثلاثة");
r |= test(13011,"ثلاثة عشر ألفًا وأحد عشر");
r |= test(13022,"ثلاثة عشر ألفًا واثنان وعشرون");
r |= test(13100,"ثلاثة عشر ألفًا ومائة");
r |= test(13200,"ثلاثة عشر ألفًا ومائتان");
r |= test(13300,"ثلاثة عشر ألفًا وثلاثمائة");
r |= test(20001,"عشرون ألفًا وواحد");
r |= test(20002,"عشرون ألفًا واثنان");
r |= test(20003,"عشرون ألفًا وثلاثة");
r |= test(20011,"عشرون ألفًا وأحد عشر");
r |= test(20022,"عشرون ألفًا واثنان وعشرون");
r |= test(20100,"عشرون ألفًا ومائة");
r |= test(20200,"عشرون ألفًا ومائتان");
r |= test(20300,"عشرون ألفًا وثلاثمائة");
r |= test(100000,"مائة ألف");
r |= test(100001,"مائة ألف وواحد");
r |= test(100002,"مائة ألف واثنان");
r |= test(200000,"مائتا ألف");
r |= test(200001,"مائتا ألف وواحد");
r |= test(200002,"مائتا ألف واثنان");
r |= test(200003,"مائتا ألف وثلاثة");
r |= test(300000,"ثلاثمائة ألف");
r |= test(300300,"ثلاثمائة ألف وثلاثمائة");
r |= test(1000032,"مليون واثنان وثلاثون");
r |= test(1000001,"مليون وواحد");
r |= test(1000002,"مليون واثنان");
r |= test(1000003,"مليون وثلاثة");
r |= test(2002002,"مليونان وألفان واثنان");
r |= test(2002001,"مليونان وألفان وواحد");
r |= test(2002003,"مليونان وألفان وثلاثة");
r |= test(2002000,"مليونان وألفان");
r |= test(2002002000,"ملياران ومليونان وألفان");
r |= test(2452452000,"ملياران وأربعمائة واثنان وخمسون مليونًا وأربعمائة واثنان وخمسون ألفًا");
r |= test(2452002000,"ملياران وأربعمائة واثنان وخمسون مليونًا وألفان");
r |= test(255000000000,"مائتان وخمسة وخمسون مليارًا");
if (r==0) console.log("All Test Cases ....Passed.");

//------------------
function test(n,should) {
let result = numToWordsAR_M(n);
if (result !== should) {console.log(`${n} Output   : ${result}\n${n} Should be: ${should}`);return 1;}
}

Upvotes: 1

Related Questions