در این صفحه
این صفحه چه میدهد#
عدد را با حروف عربی فصیح مینویسد. جنس معدود، حالت اعرابی، حرکتگذاری و عدد ترتیبی ۱ تا ۹۹ را پشتیبانی میکند و تا 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 میدهد.
| کلید | مقدارها | پیشفرض | معنا |
|---|---|---|---|
mode | count / noun | count | عدد ساده (شمارش، جواب، جدول) یا عددی که معدود درست بعد از آن میآید |
gender | m / f | m | جنس مفرد معدود. فقط در حالت noun اثر دارد |
case | nom / acc / gen | nom | حالت اعرابی: مرفوع، منصوب، مجرور |
diacritics | none / case | none | با case، حرکت آخر کلمهها و تنوین نوشته میشود |
hundreds | mi_a / ma_i_a | mi_a | مئة یا مائة |
joinHundreds | true / false | true | ثلاثمئة (چسبیده) یا ثلاث مئة (جدا) |
negative | یک واژه، ۱ تا ۶۴ بایت | سالب | واژهٔ عدد منفی |
billion | milyar / bilyon | milyar | نام 109: مليار یا بليون |
definite | true / false | true | فقط برای عدد ترتیبی: معرفه یا نکره |
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) | UnsupportedLocaleException | unsupported_locale |
کلید یا مقدار گزینه نادرست است، گزینه با fa، یا diacritics در عدد ترتیبی | InvalidNumberException | invalid_argument |
عدد صحیح نیست، یا NAN و INF | InvalidNumberException | invalid_number / non_finite_number |
| رشته بلندتر از ۴۰۹۶ بایت | InvalidNumberException | input_too_long |
convert() از 1027 به بالا، یا ordinal() از ۹۹ به بالا | InvalidNumberException | number_too_large |
ordinal() با ۰ یا عدد منفی | InvalidNumberException | invalid_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 همان خروجی نسخههای قبلی است.