如何将数字(从 1 到 99)转换为等效的阿拉伯序数字符串

How to Convert Numbers (from 1 to 99) to the Equivalent Arabic Ordinal Number String

将数字(从 1 到 99)转换为阿拉伯序数字符串

不同于英语序数由原始数字(以数字形式)组成并添加后缀(即 1st、2nd、3rd、4th……),阿拉伯语序数不能这样写,阿拉伯序数是全文表示

下面的 table 列出了选定的阿拉伯序数(从 1 到 99)。

如果主语是男性或女性,阿拉伯语序数会有所不同。

Whosebug 上没有 Javascript 函数或解决方案可以将数字(在 1 到 99 的范围内)转换为等效的阿拉伯序数文本,同时考虑到主题(男性或女性)。

此类函数的示例可以是:

ordinalsAr(5);
ordinalsAr(21);

// result ==> الخامس
// result ==> الحادي والعشرون

ordinalsAr(5, true);   // true flag for Feminine
ordinalsAr(21, true);  // true flag for Feminine

// result ==> الخامسة
// result ==> الحادية والعشرون

Arabic Ordinal Numbers
English Ordinals English Ordinals Arabic Ordinals Arabic Ordinals
 Ordinal Number Masculine Feminine
1st First الأول الأولى
2nd Second الثاني الثانية
3rd Third الثالث الثالثة
4th Fourth الرابع الرابعة
5th Fifth الخامس الخامسة
6th Sixth السادس السادسة
7th Seventh السابع السابعة
8th Eighth الثامن الثامنة
9th Ninth التاسع التاسعة
10th Tenth العاشر العاشرة
11th Eleventh الحادي عشر الحادية عشرة
12th Twelfth الثاني عشر الثانية عشرة
13th Thirteenth الثالث عشر الثالثة عشرة
14th Fourteenth الرابع عشر الرابعة عشرة
15th Fifteenth الخامس عشر الخامسة عشرة
16th Sixteenth السادس عشر السادسة عشرة
17th Seventeenth السابع عشر السابعة عشرة
18th Eighteenth الثامن عشر الثامنة عشرة
19th Nineteenth التاسع عشر التاسعة عشرة
20th Twentieth العشرون العشرون
21st Twenty-first الحادي والعشرون الحادية والعشرون
22nd Twenty-second الثاني والعشرون الثانية والعشرون
23rd Twenty-third الثالث والعشرون الثالثة والعشرون
24th Twenty-fourth الرابع والعشرون الرابعة والعشرون
…. …………. …………. ………….
29th Twenty-ninth التاسع والعشرون التاسعة والعشرون
30th Thirtieth الثلاثون الثلاثون
…. …………. …………. ………….
40th Fortieth الأربعون الأربعون
…. …………. …………. ………….
99th Ninety-Ninth التاسع والتسعون التاسعة والتسعون

function ordinalsAr(num,isFeminine){

    let feminineSuffix = "ة";

    let specialNums = {
        1:{
            masculine: "الأول",
            feminine: "الأولى"
        },
        10:{
            masculine: "العاشر",
            feminine: "العاشرة"
        }
    }
    
    let lastDigits = {
        10:"عشر",
        20:"العشرون",
        30:"الثلاثون",
        40:"الأربعون",
        50:"الخمسون",
        60:"الستون",
        70:"السبعون",
        80:"الثمانون",
        90:"التسعون",
        // you have to add the rest here
    }

    let firstDigits = {
            1:"الحادي",
            2:"الثاني",
            3:"الثالث",
            4:"الرابع",
            5:"الخامس",
            6:"السادس",
            7:"السابع",
            8:"الثامن",
            9:"التاسع",
    }
   
    if (specialNums[num])
        return isFeminine ? specialNums[num]['feminine'] : specialNums[num]['masculine']

    if(firstDigits[num])
        return isFeminine ? firstDigits[num] + feminineSuffix : firstDigits[num]

    if(lastDigits[num])
        return lastDigits[num]
    
    let firstDigit = num % 10;
    let lastDigit = num - firstDigit
    
    if (isFeminine) {
        if(lastDigit < 20)
            return firstDigits[firstDigit] + feminineSuffix + " " + lastDigits[lastDigit] + feminineSuffix
        else
            return firstDigits[firstDigit] + feminineSuffix + " و" + lastDigits[lastDigit]
    }
    
    else{
        if(lastDigit < 20)
            return firstDigits[firstDigit] + " " + lastDigits[lastDigit]
    
    }

    return firstDigits[firstDigit] + " و" + lastDigits[lastDigit]
}

console.log(ordinalsAr(1))
console.log(ordinalsAr(1,true))
console.log(ordinalsAr(10))
console.log(ordinalsAr(25,true))
console.log(ordinalsAr(35))
console.log(ordinalsAr(19))
console.log(ordinalsAr(19,true))

//===================================
//   Additional Test Cases
//===================================
// convert all numbers from 1 to 99
// in both male and female genders
//===================================
for (let i=1; i<100; i++) {
console.log(i,ordinalsAr(i),
          ordinalsAr(i,true) );
}

看看 Alan Omar 的代码概念,将数字(从 1 到 99)转换为阿拉伯序数字符串的较短代码如下。

可以在此处找到有关阿拉伯数字转换的更多信息Arabic Numbers

/*********************************************************************
* @function      : ordinalsAr(number [, isFeminine])
* @purpose       : Converts numbers from 1 to 99 to Arabic Ordinal String
* @version       : 1.00
* @author        : Mohsen Alyafei
* @date          : 27 Jan 2022
* @Licence       : MIT
* @param         : {number} Integer from 1 to 99
* @param         : [isFeminine] the subject's gender:
*                  false (default) --> Masculine subject (e.g. output الأول الثاني الثالث)
*                  true            --> Feminine subject  (e.g. output الأولى الثانية الثالثة)
* @returns       : {string} The ordinal Arabic Text.
**********************************************************************/


function ordinalsAr(num, isFeminine=false) {
num %= 100;                  // only handle the lowest 2 digits (1-99) ignore others
let    the = "ال",           // set this to "" if you don't want the output prefixed with letters "ال"
      unit = num % 10,
    ordinal= the + [,"أول","ثاني","ثالث","رابع","خامس","سادس","سابع","ثامن","تاسع","عاشر"]
                   [num === 10 ? num : unit],                       // letters for lower part of ordinal string
    female = isFeminine ? "ة" : "",                                 // add letter "ة" if Feminine
      ones = (unit === 1 ? the + "حادي" : ordinal) + female;        // special cases for 21, 31, 41, etc.
return num <11 ? ordinal + (isFeminine && num ===1 ? "ى" : female): // from 1 to 10
       num <20 ? ones + " عشر" + female :                           // from 11 to 19
       (unit ? ones + " و" : "") +                                  // else 20 to 99
       "ال" +                                                       // always add "ال"
       [,,"عشر","ثلاث","أربع","خمس","ست","سبع","ثمان","تسع"]       // letters for 20, 30, 40...
       [ ~~(num / 10)] + "ون";
}
// *=======================================================


//=======================================
//             Test Cases
//=======================================
// List the ordinal numbers from 1 to 99
// in both Masculine and Feminine genders
//=======================================
for (let i=1; i<100; i++) {
console.log(i,"M:  "+ordinalsAr(i),
              "F:  "+ordinalsAr(i,true) );
}