-- وحدة لتحويل الأرقام إلى كلمات عربية
-- Arabic version of ConvertNumeric for converting numbers to Arabic text
-- This is a simplified version focusing on common Convert module usage
require('strict')
-- الأرقام من 0 إلى 19 (مذكر)
local ones_position_masc = {
[0] = 'صفر',
[1] = 'واحد',
[2] = 'اثنان',
[3] = 'ثلاثة',
[4] = 'أربعة',
[5] = 'خمسة',
[6] = 'ستة',
[7] = 'سبعة',
[8] = 'ثمانية',
[9] = 'تسعة',
[10] = 'عشرة',
[11] = 'أحد عشر',
[12] = 'اثنا عشر',
[13] = 'ثلاثة عشر',
[14] = 'أربعة عشر',
[15] = 'خمسة عشر',
[16] = 'ستة عشر',
[17] = 'سبعة عشر',
[18] = 'ثمانية عشر',
[19] = 'تسعة عشر'
}
-- الأرقام من 0 إلى 19 (مؤنث)
local ones_position_fem = {
[0] = 'صفر',
[1] = 'واحدة',
[2] = 'اثنتان',
[3] = 'ثلاث',
[4] = 'أربع',
[5] = 'خمس',
[6] = 'ست',
[7] = 'سبع',
[8] = 'ثمان',
[9] = 'تسع',
[10] = 'عشر',
[11] = 'إحدى عشرة',
[12] = 'اثنتا عشرة',
[13] = 'ثلاث عشرة',
[14] = 'أربع عشرة',
[15] = 'خمس عشرة',
[16] = 'ست عشرة',
[17] = 'سبع عشرة',
[18] = 'ثمان عشرة',
[19] = 'تسع عشرة'
}
-- العشرات
local tens_position = {
[2] = 'عشرون',
[3] = 'ثلاثون',
[4] = 'أربعون',
[5] = 'خمسون',
[6] = 'ستون',
[7] = 'سبعون',
[8] = 'ثمانون',
[9] = 'تسعون'
}
-- المئات
local hundreds = {
[1] = 'مائة',
[2] = 'مائتان',
[3] = 'ثلاثمائة',
[4] = 'أربعمائة',
[5] = 'خمسمائة',
[6] = 'ستمائة',
[7] = 'سبعمائة',
[8] = 'ثمانمائة',
[9] = 'تسعمائة'
}
-- الآلاف والملايين
local groups = {
[1] = 'ألف',
[2] = 'مليون',
[3] = 'مليار',
[4] = 'تريليون',
[5] = 'كوادريليون',
[6] = 'كوينتيليون'
}
-- تحويل رقم إلى كلمات عربية (أقل من 100)
local function numeral_to_arabic_less_100(num, feminine, zero)
local ones_table = feminine and ones_position_fem or ones_position_masc
if num == 0 and zero ~= nil then
return zero
elseif num < 20 then
return ones_table[num]
elseif num % 10 == 0 then
return tens_position[num / 10]
else
local ones = num % 10
local tens = math.floor(num / 10)
return ones_table[ones] .. ' و' .. tens_position[tens]
end
end
-- تحويل رقم إلى كلمات عربية (أقل من 1000)
local function numeral_to_arabic_less_1000(num, feminine, zero)
num = tonumber(num)
if num < 100 then
return numeral_to_arabic_less_100(num, feminine, zero)
elseif num % 100 == 0 then
return hundreds[num/100]
else
local hundreds_digit = math.floor(num/100)
local remainder = num % 100
return hundreds[hundreds_digit] .. ' ' .. numeral_to_arabic_less_100(remainder, feminine, zero)
end
end
-- دالة أساسية لتحويل الأرقام إلى كلمات عربية
local function _numeral_to_arabic(num, capitalize, feminine, zero)
if not num or num == '' then
return zero or 'صفر'
end
-- تحويل إلى نص والتنظيف
num = tostring(num)
num = num:gsub("^%s*(.-)%s*$", "%1") -- إزالة المسافات
num = num:gsub(",", "") -- إزالة الفواصل
-- التحقق من الأرقام السالبة
local negative = num:find("^%-")
if negative then
num = num:sub(2)
end
-- التحقق من صحة الرقم
if not num:match("^%d+$") then
return zero or 'صفر'
end
local result = ''
local num_value = tonumber(num)
-- معالجة الأرقام الكبيرة
if num_value == 0 then
result = zero or 'صفر'
elseif num_value < 1000 then
result = numeral_to_arabic_less_1000(num_value, feminine, zero)
else
-- معالجة مبسطة للأرقام الكبيرة
local group_count = 0
while #num > 3 do
group_count = group_count + 1
local group_size = (#num - 1) % 3 + 1
local group_num = tonumber(num:sub(1, group_size))
if group_num > 0 then
if result ~= '' then result = result .. ' ' end
result = result .. numeral_to_arabic_less_1000(group_num, feminine, zero)
if groups[group_count] then
result = result .. ' ' .. groups[group_count]
end
end
num = num:sub(group_size + 1)
end
-- المجموعة الأخيرة
local final_num = tonumber(num)
if final_num > 0 then
if result ~= '' then result = result .. ' ' end
result = result .. numeral_to_arabic_less_1000(final_num, feminine, zero)
end
end
-- إضافة السالب
if negative and result ~= (zero or 'صفر') then
result = 'سالب ' .. result
end
-- الحرف الكبير
if capitalize then
result = result:gsub("^(.)", function(c) return mw.ustring.upper(c) end)
end
return result
end
-- دالة مبسطة للاستخدام من قِبل وحدة Convert
local function spell_number(number, numerator, denominator, case, sp, adj)
-- معاملات أساسية لوحدة Convert
local capitalize = (case == true)
local zero = nil
local feminine = false -- يمكن تخصيصه حسب الحاجة
-- تحويل الرقم الأساسي
local result = _numeral_to_arabic(number, capitalize, feminine, zero)
-- معالجة الكسور (مبسطة)
if numerator and denominator then
local num_text = _numeral_to_arabic(numerator, false, feminine, zero)
local den_text = _numeral_to_arabic(denominator, false, feminine, zero)
if result and result ~= '' and result ~= 'صفر' then
result = result .. ' و' .. num_text .. ' من ' .. den_text
else
result = num_text .. ' من ' .. den_text
end
end
return result or 'صفر'
end
-- واجهة الوحدة
local p = {
spell_number = spell_number,
}
-- دالة للاستدعاء من القوالب
function p.numeral_to_arabic(frame)
local args = frame.args
return _numeral_to_arabic(
args[1],
args['case'] == 'U' or args['case'] == 'u',
args['gender'] == 'f' or args['gender'] == 'fem',
args['zero']
) or 'صفر'
end
return p