أثناء عملي أحتجت لكتابة فئة تحول عملة معينة لوصفها لغة معينه بمعنى أخر تفقيط العملة بلغة معينة لذا قمت بكتبة فئة للقيام بهذه المهمه و انتهى بى الأمر لكتابة الكود محور هذا الموضوع.
المشروع موجود بالمرفقات و مصدره داخل موقع 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
---------------------------
و الله ولي التوفيق