الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تفقيط الأرقام لنصوص

بدأه C++er في 31 ديسمبر 2013 · 0 رد · 1,305 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

أثناء عملي أحتجت لكتابة فئة تحول عملة معينة لوصفها لغة معينه بمعنى أخر تفقيط العملة بلغة معينة لذا قمت بكتبة فئة للقيام بهذه المهمه و انتهى بى الأمر لكتابة الكود محور هذا الموضوع.
 
المشروع موجود بالمرفقات و مصدره داخل موقع github إن اردت أخر تحديثات قم بالحصول عليها من هناك.
 
الكود يحتوى على الفئتين FormatInfo و FormatNumber حيث الأولي ستحتوى على نتيجة التحويلو الأولي هى من يقوم بعملية التحويل الفعلية.
 
الفئة FormatInfo شكلها كالتالي:

/// <summary>
/// format information of number
/// </summary>
public class FormatInfo
{
	/// <summary>
	/// integer part of number
	/// </summary>
	public ulong Integer;

	/// <summary>
	/// string version of the integer part
	/// </summary>
	public string IntegerString;

	/// <summary>
	/// fraction part of number
	/// </summary>
	public ulong Fraction;

	/// <summary>
	/// string version of the fraction part
	/// </summary>
	public string FractionString;

	/// <summary>
	/// integer and fraction are converted to string-digits using NumberFormatInfo specified in FormatNumber
	/// </summary>
	public string NumberFormatted;
}

حيث انى استخدمها فى التحويل لعملة فأحتجت أن اضع فى الحسبان ان العملة التى احولها تحتوى على جزء صحيح و أخر كسر و لكل منهم أسم فالعلمة قد تكون يورو و الكسر يكون سنت و بالتالي الأفضل ان يكونوا منفصلين و تفقيط إسم العملة سأجعله فى مكان منفصلو ذلك لانى قد احتاج إستخدام كود التفقيط بمكان أخر فى مشروعي.
 
الحقلين Integer و Fraction يحتووا على القيمة الرقمية التى تم إدخالها للفئة FormatNumber لإجراء عملية التحويل و السبب فى وجودهم مع النتيجه هو انى قد احتاج لهم فى مكان اخر.
الحقلين IntegerString و FractionString يحتووا على الوصف النصي للقيم الرقمية المدخلة باللغة التى قمت بتحديدها (سأشرح هذه النقطه بعد قليل).
الحقل NumberFormatted يحتوى النسخه النصية من الرقمين Integer و Fraction و لكن بعد دمجهم و وضع علامة الفاصلة و العلامة العشرية ة اللتان بدروهم يأتوا من توصيف الأرقام الذى تقوم بإدخاله للفئه FormatNumber و الإفتراضي إن لم تدخله هو en-US.
 
 
الفئه FormatNumber هى abstract و شكلها كالتالي:

public abstract class FormatNumber
{
    private static NumberFormatInfo defaultNumberFormat = new CultureInfo(0x409).NumberFormat;

    /// <summary>
    /// default number format
    /// </summary>
    public static NumberFormatInfo DefaultNumberFormat
    {
        get { return defaultNumberFormat; }
    }

    /// <summary>
    /// convert input integer to string
    /// </summary>
    /// <param name="intPart">integer part of number</param>
    /// <returns>return FormatInfo with result conversion</returns>
    public FormatInfo ToString(ulong intPart)
    {
        return ToString(intPart, 0, defaultNumberFormat);
    }

    /// <summary>
    /// convert input integer to string
    /// </summary>
    /// <param name="intPart">integer part of number</param>
    /// <param name="format">number style information</param>
    /// <returns>return FormatInfo with result conversion</returns>
    public FormatInfo ToString(ulong intPart, NumberFormatInfo format)
    {
        return ToString(intPart, 0, format);
    }

    /// <summary>
    /// convert input integer to string
    /// </summary>
    /// <param name="intPart">integer part of number</param>
    /// <param name="fractionPart">fraction part of number</param>
    /// <returns>return FormatInfo with result conversion</returns>
    public FormatInfo ToString(ulong intPart, ulong fractionPart)
    {
        return ToString(intPart, fractionPart, defaultNumberFormat);
    }

    /// <summary>
    /// convert input number to its string description
    /// </summary>
    /// <param name="intPart">integer part of number</param>
    /// <param name="fractionPart">fraction part of number</param>
    /// <param name="format">number style information</param>
    /// <returns>return FormatInfo with convert result</returns>
    public abstract FormatInfo ToString(ulong intPart, ulong fractionPart, NumberFormatInfo format);
}

الدوال ToString كلها تستدعى فى النهاية نسخه واحده و التى ستقوم أنت بكتابة الكود لها فى فئة جديده تبعا للغة التى تريدهاو بشكل إفتراضي قمت بكتابة واحده للغة العربية و سأتحدث عنها بعد قليل.
 
الدالة ToString الرئيسية تطلب منك القيمة الصحيحة و القيمة الكسرية (كرقم صحيح) و أيضا تطلب وصف ترميز الأرقام و العلامات العشرية الذى من خلاله سيتم تحميع الجزء العشرى و الصحيح معا.
 
عندما تقوم بكتابة كود للغة محدده لا تقوم بجعلها public و لكن قم بجعلها internal و قم بإضافة static property داخل الفئة FormatNumber و تقوم هى بإنشائه و الخاصية نفسها تكون بإسم اللغه التى تفقط الأرقام لها.
 
كتطبيق لهذا قمت بكتابة الفئة FormatNumberToArabic كتضمين للفئة FormatNumber لتفقيط الأقام باللغة العربية و وضعت إستددعائها داخل الفئه FormatNumber كالتالي:

public abstract class FormatNumber
{
    // number converter to Arabic string
    private static FormatNumber arabic = new FormatNumberToArabic();

    /// <summary>
    /// get number to Arabic string converter
    /// </summary>
    public static FormatNumber Arabic
    {
        get { return arabic; }
    }
}

و بالتالي فى كل مرة تريد تفقيط الأرقام للعربية كل ما تحتاج هو استدعاء الدالة ToString من Arabic.
 
كود التفقيط للعربية قمت بوضعه على ملفين الأول 'ArabicFormat.cs' و يحتوى على كود الفئة FormatNumberToArabic و الملف الثاني 'ArabicStrings.cs' و يحتوى على ثوابت للكلمات العربية التى استخدمتها فى التحويل و فصلتها هنا لتنسيق الكود و جعله سهل فى القراءة و التصحيح.

 

النسخه العربية تستطيع تفقيط كل أرقام النوع ulong و أكثر قليلا إن وجد.

 

مثال الإستخدام

using System;
using System.Windows.Forms;
using NumberToString;

class Program
{
    public static void Main()
    {
        FormatInfo fi = FormatNumber.Arabic.ToString(ulong.MaxValue);

        string s = ulong.MaxValue.ToString() + "\n" + fi.NumberFormatted + "\n" + fi.IntegerString;

        MessageBox.Show(s, "Arabic description",
                        MessageBoxButtons.OK, MessageBoxIcon.None,
                        MessageBoxDefaultButton.Button1,
                        MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign);
    }
}

النتيجة:

اقتباس

---------------------------
Arabic description
---------------------------
18446744073709551615
18,446,744,073,709,551,615
ثمانية عشر كوينتيليون و أربعمائة و ستة و أربعون كوادريليون و سبعمائة و أربعة و أربعون تريليون و ثلاثة و سبعون مليار و سبعمائة و تسعة مليون و خمسمائة و واحد و خمسون ألف و ستمائة و خمسة عشر
---------------------------
OK  
---------------------------

 

 

numstr.zip

 

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 31 ديسمبر 2013 في 07:26

مدونتي: C++ Tips and Tricks

مواضيع مشابهة