وحدة:ConvertNumeric

Usage

{{#invoke:ConvertNumeric|function_name}}

See also


-- وحدة لتحويل الأرقام إلى كلمات عربية
-- 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