عدد به حروف عربی

نوشتن عدد با حروف عربی فصیح، با جنس معدود، حالت اعرابی، اعراب‌گذاری و عدد ترتیبی. هر عدد صحیح زیر 10^27.

در این صفحه
  1. این صفحه چه می‌دهد
  2. شروع سریع
  3. گزینه‌ها
  4. معدود و جنس
  5. حالت اعرابی
  6. حرکت‌گذاری
  7. املای صدگان
  8. مقیاس‌های بزرگ
  9. عدد منفی
  10. عدد ترتیبی
  11. خطاها
  12. منبع‌ها و خوب است بدانید

این صفحه چه می‌دهد#

عدد را با حروف عربی فصیح می‌نویسد. جنس معدود، حالت اعرابی، حرکت‌گذاری و عدد ترتیبی ۱ تا ۹۹ را پشتیبانی می‌کند و تا 1027 می‌رود. عدد به حروف فارسی در عدد به حروف است.

شروع سریع#

برای نوشتن عدد به عربی، زبان 'ar' را به NumberToWords::convert() بدهید. بدون گزینه، خروجی عدد ساده است، مثل شمارش یا جواب یک پرسش (مذکر).

<?php
require 'vendor/autoload.php';

use RtlyKit\Number\NumberToWords;

echo NumberToWords::convert(11, 'ar'), "\n";         // أحد عشر
echo NumberToWords::convert(21, 'ar'), "\n";         // واحد وعشرون
echo NumberToWords::convert(1234, 'ar'), "\n";       // ألف ومئتان وأربعة وثلاثون
echo NumberToWords::convert(3000, 'ar'), "\n";       // ثلاثة آلاف
echo NumberToWords::convert(2000000, 'ar'), "\n";    // مليونان
echo NumberToWords::convert(-7, 'ar'), "\n";         // سالب سبعة
echo \RtlyKit\number_to_words(3, 'ar'), "\n";        // ثلاثة

تابع کمکی number_to_words() فقط عدد و زبان می‌گیرد. برای گزینه‌ها از NumberToWords::convert() استفاده کنید. ورودی (عدد صحیح، رشته با رقم فارسی و جداکننده، خطاها) مثل فارسی است. جزئیاتش در عدد به حروف آمده است.

بازه: هر عدد صحیح کوچک‌تر از 1027. عدد بزرگ‌تر خطای number_too_large می‌دهد.

گزینه‌ها#

گزینه‌ها را به‌صورت آرایه یا شیء RtlyKit\Number\ArabicOptions به آرگومان سوم بدهید. کلید ناشناخته یا مقدار نادرست InvalidNumberException می‌دهد.

کلیدمقدارهاپیش‌فرضمعنا
modecount / nouncountعدد ساده (شمارش، جواب، جدول) یا عددی که معدود درست بعد از آن می‌آید
genderm / fmجنس مفرد معدود. فقط در حالت noun اثر دارد
casenom / acc / gennomحالت اعرابی: مرفوع، منصوب، مجرور
diacriticsnone / casenoneبا case، حرکت آخر کلمه‌ها و تنوین نوشته می‌شود
hundredsmi_a / ma_i_ami_aمئة یا مائة
joinHundredstrue / falsetrueثلاثمئة (چسبیده) یا ثلاث مئة (جدا)
negativeیک واژه، ۱ تا ۶۴ بایتسالبواژهٔ عدد منفی
billionmilyar / bilyonmilyarنام 109: مليار یا بليون
definitetrue / falsetrueفقط برای عدد ترتیبی: معرفه یا نکره
use RtlyKit\Number\ArabicOptions;

echo NumberToWords::convert(3, 'ar', ['mode' => 'noun', 'gender' => 'f']), "\n";   // ثلاث
$options = new ArabicOptions(mode: 'noun', gender: 'f');
echo NumberToWords::convert(3, 'ar', $options), "\n";                              // ثلاث

گزینه‌ها فقط برای عربی‌اند. اگر همراه 'fa' بدهید، خطای invalid_argument می‌گیرید.

معدود و جنس#

در عربی عدد با معدود هماهنگ می‌شود. mode: 'noun' یعنی معدود درست بعد از عدد می‌آید. gender جنس مفرد معدود است. قاعدهٔ ۳ تا ۱۰ برعکس است: معدود مذکر عدد با تاء می‌گیرد (ثلاثة) و معدود مؤنث بدون تاء (ثلاث). ۱ و ۲ و ۱۱ و ۱۲ با معدود هم‌جنس‌اند.

$m = ['mode' => 'noun', 'gender' => 'm'];
$f = ['mode' => 'noun', 'gender' => 'f'];

echo NumberToWords::convert(3, 'ar', $m), ' | ', NumberToWords::convert(3, 'ar', $f), "\n";    // ثلاثة | ثلاث
echo NumberToWords::convert(13, 'ar', $m), ' | ', NumberToWords::convert(13, 'ar', $f), "\n";  // ثلاثة عشر | ثلاث عشرة
echo NumberToWords::convert(2, 'ar', $m), ' | ', NumberToWords::convert(2, 'ar', $f), "\n";    // اثنان | اثنتان
echo NumberToWords::convert(25, 'ar', $m), ' | ', NumberToWords::convert(25, 'ar', $f), "\n";  // خمسة وعشرون | خمس وعشرون
echo NumberToWords::convert(8, 'ar', $f), "\n";                                              // ثماني

در حالت noun، آخرین کلمهٔ عبارت به معدود اضافه می‌شود. پس دوگانه‌ها شکل اضافه می‌گیرند:

echo NumberToWords::convert(200, 'ar', ['mode' => 'noun']), "\n";                        // مئتا
echo NumberToWords::convert(2000, 'ar', ['mode' => 'noun']), "\n";                       // ألفا
echo NumberToWords::convert(2000000, 'ar', ['mode' => 'noun', 'case' => 'gen']), "\n";   // مليوني

در حالت count جنس نادیده گرفته می‌شود و همیشه شکل مذکر می‌آید. بخش‌های بالای ۱۰۰۰ (ضریب صد و ضریب مقیاس) با جنس معدود عوض نمی‌شوند: ۳۰۰۰ برای معدود مؤنث هم «ثلاثة آلاف» است.

نکته: خود معدود را عدد به حروف نمی‌نویسد. شما کنار عدد می‌گذارید.

حالت اعرابی#

بعضی کلمه‌ها حتی بدون حرکت‌گذاری با حالت عوض می‌شوند: اثنان و اثنين، عشرون و عشرين، مئتان و مئتين، ألفان و ألفين، اثنا عشر و اثني عشر. گزینهٔ case همین حرف‌ها را تعیین می‌کند:

echo NumberToWords::convert(2, 'ar', ['case' => 'gen']), "\n";     // اثنين
echo NumberToWords::convert(20, 'ar', ['case' => 'acc']), "\n";    // عشرين
echo NumberToWords::convert(200, 'ar', ['case' => 'gen']), "\n";   // مئتين
echo NumberToWords::convert(12, 'ar'), "\n";                       // اثنا عشر
echo NumberToWords::convert(12, 'ar', ['case' => 'acc']), "\n";    // اثني عشر

حرکت‌گذاری#

با diacritics: 'case' آخر هر کلمهٔ معرب حرکت یا تنوین می‌گیرد. فقط حرکت آخر نوشته می‌شود، نه حرکت وسط کلمه.

echo NumberToWords::convert(1234, 'ar', ['diacritics' => 'case']), "\n";   // ألفٌ ومئتانِ وأربعةٌ وثلاثونَ
echo NumberToWords::convert(2025, 'ar', ['diacritics' => 'case']), "\n";   // ألفانِ وخمسةٌ وعشرونَ
echo NumberToWords::convert(5, 'ar', ['diacritics' => 'case']), "\n";      // خمسةٌ
echo NumberToWords::convert(5, 'ar', ['diacritics' => 'case', 'mode' => 'noun']), "\n";   // خمسةُ

در حالت noun کلمهٔ آخر به معدود اضافه شده و تنوین نمی‌گیرد (خمسةُ). حرکت‌گذاری برای عدد ترتیبی تعریف نشده و خطای invalid_argument می‌دهد.

املای صدگان#

echo NumberToWords::convert(300, 'ar'), "\n";                                              // ثلاثمئة
echo NumberToWords::convert(300, 'ar', ['joinHundreds' => false]), "\n";                   // ثلاث مئة
echo NumberToWords::convert(300, 'ar', ['hundreds' => 'ma_i_a']), "\n";                    // ثلاثمائة

مقیاس‌های بزرگ#

نام مقیاس‌ها به روش مقیاس کوتاه است: ألف (103)، مليون (106)، مليار (109)، تريليون (1012)، كوادريليون (1015)، كوينتيليون (1018)، سكستيليون (1021) و سبتيليون (1024). برای ۳ تا ۱۰ از جمع استفاده می‌شود (آلاف، ملايين، مليارات، تريليونات و ...) و برای ۲ از مثنی (مليونان).

echo NumberToWords::convert(3000000, 'ar'), "\n";                    // ثلاثة ملايين
echo NumberToWords::convert(5000000000000, 'ar'), "\n";              // خمسة تريليونات
echo NumberToWords::convert('1000000000000000000000000', 'ar'), "\n"; // سبتيليون
echo NumberToWords::convert(102000, 'ar'), "\n";                     // مئة ألف وألفان
echo NumberToWords::convert(111000, 'ar'), "\n";                     // مئة وأحد عشر ألف
echo NumberToWords::convert(1000000000, 'ar'), "\n";                 // مليار
echo NumberToWords::convert(1000000000, 'ar', ['billion' => 'bilyon']), "\n";   // بليون

اگر بخشی از عدد به شکل «صدگان به‌اضافهٔ ۱ تا ۱۰» باشد، برای اینکه خوانا بماند جدا نوشته می‌شود: ۱۰۲٬۰۰۰ می‌شود «مئة ألف وألفان». بخش‌های با ۱۱ تا ۹۹ یا بدون باقیمانده همان شکل ساده را دارند.

عدد منفی#

عدد منفی با «سالب» شروع می‌شود. با گزینهٔ negative می‌توانید واژهٔ دیگری بگذارید (یک واژه، ۱ تا ۶۴ بایت).

echo NumberToWords::convert(-7, 'ar'), "\n";                            // سالب سبعة
echo NumberToWords::convert(-5, 'ar', ['negative' => 'ناقص']), "\n";   // ناقص خمسة

عدد ترتیبی#

NumberToWords::ordinal($number, 'ar', $options) عدد ترتیبی ۱ تا ۹۹ را می‌نویسد. این‌ها اثر دارند: gender (جنس موصوف)، case و definite. mode نادیده گرفته می‌شود.

echo NumberToWords::ordinal(1), ' | ', NumberToWords::ordinal(1, 'ar', ['gender' => 'f']), "\n";   // الأول | الأولى
echo NumberToWords::ordinal(3), ' | ', NumberToWords::ordinal(3, 'ar', ['gender' => 'f']), "\n";   // الثالث | الثالثة
echo NumberToWords::ordinal(12), "\n";                                                         // الثاني عشر
echo NumberToWords::ordinal(21), ' | ', NumberToWords::ordinal(21, 'ar', ['gender' => 'f']), "\n"; // الحادي والعشرون | الحادية والعشرون
echo NumberToWords::ordinal(20, 'ar', ['case' => 'gen']), "\n";                                // العشرين
echo NumberToWords::ordinal(2, 'ar', ['definite' => false, 'case' => 'acc']), "\n";            // ثانيا

عدد ترتیبی فقط برای زبان ar است. برای ۰، عدد منفی یا عدد بالای ۹۹ خطا می‌گیرید. عدد ترتیبی فارسی را Format::ordinal() می‌سازد.

خطاها#

وضعیتخطاکد
زبان پشتیبانی نمی‌شود (در ordinal()، هر زبان غیر از ar)UnsupportedLocaleExceptionunsupported_locale
کلید یا مقدار گزینه نادرست است، گزینه با fa، یا diacritics در عدد ترتیبیInvalidNumberExceptioninvalid_argument
عدد صحیح نیست، یا NAN و INFInvalidNumberExceptioninvalid_number / non_finite_number
رشته بلندتر از ۴۰۹۶ بایتInvalidNumberExceptioninput_too_long
convert() از 1027 به بالا، یا ordinal() از ۹۹ به بالاInvalidNumberExceptionnumber_too_large
ordinal() با ۰ یا عدد منفیInvalidNumberExceptioninvalid_number
try {
    NumberToWords::convert(5, 'ar', ['gender' => 'x']);
} catch (\RtlyKit\Exceptions\InvalidNumberException $e) {
    echo $e->getMessage(), ' [', $e->getErrorCode()->value, "]\n";
    // Invalid option "gender": expected one of m, f. [invalid_argument]
}

منبع‌ها و خوب است بدانید#

خوب است بدانید. شکل‌های عربی از منابع دستور زبان ذکرشده در بخش منابع گرفته شده‌اند. چند خروجی هنوز منتظر بازبینی یک عرب‌زبان است، مثلاً جمله‌های بسیار بزرگ، نام مقیاس‌های بالای مليار و جدا کردن گروه‌هایی مثل ۱۰۲٬۰۰۰. اگر متن را در سند رسمی یا حقوقی می‌گذارید، یک عرب‌زبان آن را بخواند.
  • نام مقیاس‌های بزرگ‌تر از مليار قرارداد رایج مقیاس کوتاه است. مقیاس بلند ارائه نمی‌شود.
  • گزینه‌ها فقط روی convert() و ordinal() کار می‌کنند. تابع کمکی number_to_words() گزینه نمی‌گیرد.
  • مقدار پیش‌فرض بدون گزینه برای هر عدد زیر 109 همان خروجی نسخه‌های قبلی است.