• 0
Dr.Robert

تحويل الأعداد من صيغة رقمية الى حرفية

سؤال

السلام عليكم

خلال اليوميين الماضيين كنت غير مشغول وتقريبا "فاضي" تماما واشعر بالملل. وبدأت اقلب في اشياء واوراق قديمة

وقعت في يدي فاتورة قديمة ولاحظت أن المبلغ المسجل في الفاتورة (بشكل يدوي) مكتوب رقما وكتابة (سبحان الله) قد يقول البعض ولكن حلمكم علي شوي.

بدأت افكر : كيف استطيع ترجمة رقم مثل 17 الى "سبعة عشر" في برنامج؟

استحوذ الموضوع على إهتمامي وتركت ما في يدي , و امسكت ورقة وقلم وقعدت افكر واشخبط في شكل خوارزمية بسيطة.

ومع مرور الوقت تحولت من حبر على ورق الى Java class بسيط .

مبدأ الخوارزمية الذي توصلت له غير معقد بالمرة:

المدخل لهذة الخوارزمية هو عدد (بصورة رقمية مثل 123) .

تقوم الخوارزمية بمسح (scan) العدد من اقصى اليمين (خانة آحاد الوحدات) وصعودا الى اخر رقم في اقصى اليمين .

اثناء المسح وعند كل خانة يجب ان تتوفر للخوارزمية قيمتين , القيمة الاولى هي خانة العدد المقروء (احاد,عشرات ام مئات) , وكذلك القوة العشرية للموقع .

فمثلا واثناء المسح وجدنا العدد 2 في خانة العشرات , هذا يعني ان القيمة الحرفية لة هي "عشرون" بشكل مبدأي.

ومن خلال القوة العشرية لموقع الرقم نستطيع ان نعرف هل هي "عشرون" فقط ام "عشرون الف" ام "عشرون مليون" وهكذا.

القيم الحرفية الأساسية للأرقام , ستكون عبارة عن كلمات مخزونة ("صفر,واحد,اثنان.......,عشرة ,عشرون, ثلاثون....مائة ,الف, مليون...") . ومنها تستطيع الخوارزمية انشاء تركيبات حرفية مثل "سبعة عشرة الف و خمسة مائة".

تطبيق الخوارزمية برمجيا ليس معقدا. وبالإمكان تطبيقها بكود جميل وغير معقد.

ولكن.

بما أن اللغة العربية لها قواعد لغوية صارمة . نجد ان نص مثل "اثنان الف" غير مقبول قواعديا بل "الفان"

و نص مثل "اثنين عشرة" لا وجود لة في اللغة العربية بل "اثنا عشرة".

ولذلك كان لابد من محاولة إدخال "بعض" القواعد على الكود , فتحول الكود من كود Java الى شيء يشبة كود الC :huh: (مع كل التقدير لمبرمجي C).

وعلى العموم الموضوع بأكملة كان مثير ومنعش للعقل.

لا اطيل عليكم واترككم مع النتيجة النهائية وهي عبارة عن فئة تحوي دالة واحدة فقط public static تأخذ متغير واحد من نوع Number وتعيد String

وهي صالحة للأعداد الموجبة والسالبة وكذلك الكسور

ملحوظة للأخ علاء الصالحي:

قرأت هنا او هناك انك قمت بتطوير حزمة خاصة بالأرقام العربية ,لم اراها حتى الان, ولكن مارأيك ان تقوم بتضمين الفئة هذه للحزمة؟ بعد تجربتها والتأكد من فائدتها إن شاء الله.

ArabicLiteralNumberParser.java

تم تعديل بواسطه Dr.Robert
5

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

129 إجابة على هذا السؤال .

  • 0

لا اعتقد ان الأعداد العشرية لها قاعدة خاصة .

يعني الرقم 12 هو اثنا عشر للمذكر واثنتا عشرة للمؤنث. وهذا للأعداد الصحيحة

وقياسا على ما سبق اذا جاء الرقم 12 بعد الفاصلة العشرية فهو اثنا عشر من مائة للمذكر و اثنتا عشرة من مائة للمؤنث .

والله الشغل اخذ كل وقتي يا اخ علاء (انا اداوم في عملين الانwacko.gif) .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مش عارف يا مازن بس حاسس العدد مش مزبوط

شكلي هجيب إيهاب :)

أعانك الله وييسر عليك

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جهد مشكور يا شباب، ولكن هناك ملاحظات قواعد التأنيث والتذكير.. فنحن نقول سبعة ملايين امرأة، وليس سبع ملايين امرأة، لأن تمييز العدد في هذه الحالة هو "ملايين" وليس "امرأة"، ومليون كلمة مذكرة.

على كل حال، لقد بنيت على جهدكم المشكور، وحولت الكود إلى فيجوال بيزيك وسي شارب، وأضفت إليه تعديلات وإضافات غير المؤنث والمذكر.. حيث يمكن إرسال الاسم المعدود إلى الدالة في صورة المفرد والجمع، ليتم كتابة التمييز بعد العغدد في الصورة الصحيحة مفردا أو جمعا، منصوبا أو مجرورا..

ملحوظة أخرى: البليون هو المليار.. هذا اختلاف في اللغات الأوروبية ليس أكثر.

https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/s720x720/1467424_603264449728667_175780524_n.png

يمكنكم تحميل الفئة الجديدة (نسخة فيجوال بيزيك  ونسخة سي شارب) ومشروعين لتجربتها من هنا:

https://www.mediafire.com/?i8g39ihbwk6lw6u

تم تعديل بواسطه dreammaker
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

على فكرة: عندي تصور لتبسيط كود هذه الدالة (لا أجد وقتا لتنفيذه الآن)، وهو كتابة دالة تحويل تعمل على ثلاث خانات فقط وليكن اسمها Convert3Digits، وبهذا يمكن تقسيم الرقم إلى ثلاثيات وإرسال كل منها إلى هذه الدالة لتحويلها، ويلصق بعدها تمييز الآلاف المناسب لموضع الثلاثية (""، ألف، مليون، مليار، تريلون... إلخ).. هذا سيبسط الكود كثيرا، وإن كان سيستخدم نفس الخوارزمية التي استخدمتموها.. لكن أتصور أن الكود سيكون مختصرا وأسهل في فهمه.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .