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

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

رائج
بدأه Dr.Robert في 23 مايو 2010 · 129 رد · 15,005 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
ولن يكلفك الموضوع الكثير مع استخدامك لل object-oriented programming وهو اسلوبك فى هذه الفئة

ولكن لاحظ اننا لن نستطيع ان نضع دالة لل double للأسباب التي شرحتها سابقا.

والدالة ايظا تعجز عن ترجمة جميع الاعداد من نوع float (لأن Float.MAX_VALUE > Long.MAX_VALUE)

يعني الامر سيقتصر على دوال ل long وshort وinteger .

وبالتالي لا يمكن ترجمة للأعداد الكسرية . لأن الأنواع المذكورة هي للأعداد الصحيحة فقط

وهذة هي المعضلة.

الدالة قادرة على ترجمة جميع الاعداد(كسور وغير كسور) من 0 الى Long.MAX_VALUE

لا استطيع ان احدد نوعها ك float او double لأنهم اكبر من long ولا

استطيع ان احدد نوعها ك long لأنه اصلا لا يدعم الكسور .

يعني اذا كان هناك نوع اقل من float و في نفس حجم long ويدعم الكسور لأستخدمناه دون تردد

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

اخي هويدي تبدو وسيما في الصورة (بدون مجاملة :lol: )

تم تعديل هذه المشاركة بواسطة Dr.Robert في 24 مايو 2010 في 16:40

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#27

أخ مازن, أولا شكرا على المجاملة الرقيق,

ثانيا لا أفهم لماذا القيود على أنواع ال floating-pints , لعلي ألق نظره على الكود و أعود إليك.

شكرا لك

تم تعديل هذه المشاركة بواسطة {هويدي} في 24 مايو 2010 في 17:25

#28
{هويدي} كتب:

لا أفهم لماذا القيود على أنواع ال floating-pints

ليست هناك قيود على الاعداد الكسريه , قم بتجربة الدالة بتمرير اي عدد كسري يخطر على بالك وانظر النتيجه.

وبالطبع شأنها شأن اي داله تتعامل مع ارقام , لها حد ادنى وحد اعلى للأرقام التي تستطيع التعامل معها (من 9223372036854775807- الى 9223372036854775807) مرورا بجميع الاعداد الكسرية (كحد اقصى للكسر هو 0.9223372036854775807)

اي رقم اكبر من هذا الرقم تقوم منصة الجافا بإستخدام رمز e للتعبير عن الرقم مثل"1.3e25"

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

حتى اذا طورنا الكود

هذا سيزيد الكود تعقيدا وسيزيد عدد الكلمات المحجوزة لتشمل ما فوق التريليون (18^10) وسيصبح زمن تنفيذ الداله اكبر وفي النهاية ما الفائدة ؟ لا شيء!.

لأنة من الناحية العملية , هذة الداله لن ستستخدم لترجمة ارقام خيالية (هذا يحصل عند اجراء تجارب مجردة فقط).

تم تعديل هذه المشاركة بواسطة Dr.Robert في 24 مايو 2010 في 19:19

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#29

السلام عليكم

اخى مازن اعرف اننا لن نحتاج الى ترجمة ارقام اكبر من قيمة Long.MAX_VALUE

فهى كما قلت لا تستخدم الا فى الحسابات الفلكية والنووية وماشابه ذلك

هذه الفئة مهمة جدا ومفيدة فى عمليات لا تصل لهذه الارقام كأن نستخدمها مثلا فى فاتورة مبيعات

او شيك وماشابه وهى بهذا الرقم الذى تستطيع ترجمته Long.MAX_VALUE كافية جدا وتزيد

كل ما نقترحه عليك انا والاخوة هى ان تجعلها اسهل للمبرمج المبتدئ مثلى

فهو عند استخدامها يظهر له بين الاقواس النوع Number وهو مالم يتعود عليه ان كان يعرفه اساسا

على العموم بعد اذنك طبعا قمت بتعديل بسيط على الفئة بالمطلوب من وجهة نظرى المتواضعة

لتصبح الشفرة كالتالى :

package arabic;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 *
 * @author MazenB
 */
public class ArabicLiteralNumberParser {

	private static final String ZERO = "صفر";
	private static final String ONE = "واحد";
	private static final String TWO = "إثنان";
	private static final String THREE = "ثلاثة";
	private static final String FOUR = "أربعة";
	private static final String FIVE = "خمسة";
	private static final String SIX = "ستة";
	private static final String SEVEN = "سبعة";
	private static final String EIGHT = "ثمانية";
	private static final String NINE = "تسعة";
	private static final String TEN = "عشرة";
	private static final String TWENTY = "عشرون";
	private static final String THIRTY = "ثلاثون";
	private static final String FOURTY = "أربعون";
	private static final String FIFTY = "خمسون";
	private static final String SIXTY = "ستون";
	private static final String SEVENTY = "سبعون";
	private static final String EIGHTY = "ثمانون";
	private static final String NINETY = "تسعون";
	private static final String HUNDRED = "مائة";
	private static final String THOUSAND = "الف";
	private static final String MILLION = "مليون";
	private static final String MILLIARD = "مليار";
	private static final String BILLION = "بليون";
	private static final String BILLIARD = "بليار";
	private static final String TRILLION = "تريليون";
	private static final Map<Long, String> namesMap;


	static {

 	namesMap = new HashMap<Long, String>();
 	namesMap.put(0l, ZERO);
 	namesMap.put(1l, ONE);
 	namesMap.put(2l, TWO);
 	namesMap.put(3l, THREE);
 	namesMap.put(4l, FOUR);
 	namesMap.put(5l, FIVE);
 	namesMap.put(6l, SIX);
 	namesMap.put(7l, SEVEN);
 	namesMap.put(8l, EIGHT);
 	namesMap.put(9l, NINE);
 	namesMap.put(10l, TEN);
 	namesMap.put(20l, TWENTY);
 	namesMap.put(30l, THIRTY);
 	namesMap.put(40l, FOURTY);
 	namesMap.put(50l, FIFTY);
 	namesMap.put(60l, SIXTY);
 	namesMap.put(70l, SEVENTY);
 	namesMap.put(80l, EIGHTY);
 	namesMap.put(90l, NINETY);
 	namesMap.put(100l, HUNDRED);
 	namesMap.put(1000l, THOUSAND);
 	namesMap.put(1000000l, MILLION);
 	namesMap.put(1000000000l, MILLIARD);//billion in short scale (US)
 	namesMap.put(1000000000000l, BILLION);//trillion //
 	namesMap.put(1000000000000000l, BILLIARD);//quadrllion //
 	namesMap.put(1000000000000000000l, TRILLION);//quintillion //
	}

	private static String parse(Number a) {
 	StringBuffer buf = new StringBuffer(a.toString());
 	buf.reverse();
 	int index = 0;
 	boolean negative;
 	int len = (negative = buf.charAt(buf.length() - 1) == '-') ? buf.length() - 1 : buf.length();

 	String[] name = new String[len];
 	long unitValue = 0;
 	while (index < len) {
 	Long n = Long.valueOf(String.valueOf(buf.charAt(index)));
 	int decimalPos = index % 3;
 	if (decimalPos == 0) {
 	unitValue = (Double.valueOf(Math.pow(10, index)).longValue());
 	}
 	int decimalPlace = (Double.valueOf(Math.pow(10, decimalPos)).intValue());
 	switch (decimalPlace) {
 	case 1:
 	if (unitValue > 1l && index + 1 == len) {
 	switch (n.intValue()) {
 	case 1:
 	name[index] = namesMap.get(unitValue);
 	break;
 	case 2:
 	name[index] = namesMap.get(unitValue).concat("ان");
 	break;
 	default:
 	if (unitValue == 1000l) {
 	name[index] = namesMap.get(n) + " " + "الاف";
 	} else if (unitValue == 1000000l) {
 	name[index] = namesMap.get(n) + " " + "ملايين";
 	} else {
 	name[index] = namesMap.get(n) + " " + namesMap.get(unitValue) + "ات";
 	}
 	}
 	} else {
 	name[index] = namesMap.get(n);
 	}
 	break;
 	case 10:
 	String tmp = name[index - 1];
 	if (n == 1l) {
 	if (tmp.equals(ONE)) {
 	tmp = tmp.substring(1, tmp.length());
 	} else if (tmp.equals(TWO)) {
 	tmp = tmp.substring(0, tmp.length() - 1);
 	}
 	}

 	if (unitValue > 1l && index + 1 == len) {
 	if (n == 1 && tmp.equals(ZERO)) {
 	if (unitValue == 1000l) {
 	name[index] = TEN + "الاف ";
 	} else if (unitValue == 1000000l) {
 	name[index] = TEN + "ملايين ";
 	} else {

 	name[index] = TEN + " " + namesMap.get(unitValue) + "ات";
 	}
 	} else {
 	name[index] = namesMap.get(n * 10l) + " " + namesMap.get(unitValue);
 	}
 	} else {
 	name[index] = namesMap.get(n * 10l);
 	}
 	if (n != 0l) {
 	name[index - 1] = name[index];
 	name[index] = tmp;
 	}

 	break;
 	case 100:

 	String s;
 	if (n > 2) {
 	s = namesMap.get(n);
 	s = s.substring(0, s.length() - (n == 8 ? 2 : 1)) + HUNDRED;
 	} else {
 	s = n == 2 ? "مائتان" : namesMap.get(n * 100);
 	}
 	if (unitValue > 1l && !name[index - 2].equals(ZERO)) {
 	Iterator i = namesMap.keySet().iterator();
 	while (i.hasNext()) {
 	Long val = (Long) i.next();
 	if (namesMap.get(val).equals(name[index - 2])) {
 	if (val > 2l && val <= 10l) {
 	if (unitValue == 1000l) {
 	name[index - 2] = name[index - 2] + " " + "الاف";
 	} else if (unitValue == 1000000l) {
 	name[index - 2] = name[index - 2] + " " + "ملايين";
 	} else {
 	name[index - 2] = name[index - 2] + " " + namesMap.get(unitValue) + "ات";
 	}

 	} else {
 	name[index - 2] = name[index - 2] + " " + namesMap.get(unitValue);
 	}
 	break;
 	}
 	}

 	} else if (unitValue > 1l && n != 0) {
 	s = s + " " + namesMap.get(unitValue);
 	}

 	name[index] = s;

 	}
 	index++;
 	}


 	String s = "";
 	for (int i = 0; i < len; i++) {

 	if (name.equals(ZERO)) {
 	continue;
 	}
 	name = name.trim();
 	s = name + (!s.isEmpty() && !(s.startsWith(TEN) && !name[i - 1].equals(ZERO)) ? " و" : " ") + s;

 	}
 	return s.isEmpty() ? ZERO : (negative ? "سالب " + s : s).trim();
	}

	private static String getCharacterString(Number n){

 	n = String.valueOf(n).toLowerCase().contains("e") ? n.longValue() : n;

 	String[] array = String.valueOf(n).split("\\.");

 	long i = Long.valueOf(array[0]);
 	long f = array.length == 2 ? Long.valueOf(array[1]) : 0;

 	int fractSize = f > 0 ? array[1].length() : 0;

 	String integralPart = (i != 0 || f == 0) ? parse(i) : "";

 	String fractionalPart = f > 0 ? parse(f) + " من " + parse(Double.valueOf(Math.pow(10, fractSize)).longValue()) : "";

 	return integralPart + (f * i != 0 ? " و " : "") + fractionalPart;
	}

	public static String literalValueOf(short a) {
 	if (a > Long.MAX_VALUE) {
 	return " اكبر من " + parse(Long.MAX_VALUE);
 	}

 	return getCharacterString(a);
	}

	public static String literalValueOf(int b) {
 	if (b > Long.MAX_VALUE) {
 	return " اكبر من " + parse(Long.MAX_VALUE);
 	}

 	return getCharacterString(b);
	}

	public static String literalValueOf(Long c) {
 	if (c.doubleValue() > Long.MAX_VALUE) {
 	return " اكبر من " + parse(Long.MAX_VALUE);
 	}

 	return getCharacterString(c);
	}

	public static String literalValueOf(double d) {
 	if (d > Double.valueOf(String.valueOf(Long.MAX_VALUE))) {
 	return " اكبر من " + parse(Long.MAX_VALUE);
 	}

 	return getCharacterString(d);

	}

///For testing, please remove!
	public static void main(String[] args) {
 	System.out.println(literalValueOf(Long.MAX_VALUE));
	}
}

وبناء عليه عند استخدامى للفئة فى ال Netbeans

تظهر كما فى الصورة

post-165385-12747235724474_thumb.png

ما رايك هى نفس الفئة ولكن مألوفة اكثر للمبتدئين مثلى اليس كذلك ؟

وبالنسبة للنتيجة لاحظ هذا الرقم الكبير جدا ونتيجته

post-165385-12747239510618_thumb.png

والنقاش مازال مفتوحا

تحياتى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 24 مايو 2010 في 21:00


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#30
MOHAMED FATHEI كتب:

كل ما نقترحه عليك انا والاخوة هى ان تجعلها اسهل للمبرمج المبتدئ مثلى

فهو عند استخدامها يظهر له بين الاقواس النوع Number وهو مالم يتعود عليه ان كان يعرفه اساسا

والنقاش مازال مفتوحا

تحياتى

جميل الان فهمت قصدك من جعلها overLoading

جميل وبالنسبه لى انا كانت اول مره اعرف Number

تحياتى

سلام عليكم

1 −1

Software Developer
Mahmoudkelany.com


 

#31

اهلا بك اخى محمود

Eng.Hamzawy كتب:

جميل وبالنسبه لى انا كانت اول مره اعرف Number

وهذا مانقصده اخ مازن

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#32

متابعة.......................................

:wub:

00020309t.gif

1958_1963.gif
#33
اسراء شلبى كتب:

متابعة.......................................

:wub:

اذا اكتبى رأيك فى الموضوع

كلمة واحدة ما كل هذا الكسل ؟ :lol:

تحياتى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 24 مايو 2010 في 21:26


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#34

احب ان اتابع من بعيد و ارى المناقشة و

اسألتك اخ محمد فى الصميم

انا بس بسجل متابعتى للموضوع

و كمان انا مش فاضية انا رايحة خطوبة صديقتى

عقبالكم؛؛؛؛؛الخطوبة و لا الموضوع يا اسراء>>>امممممم الموضوع طبعا لما ارجع ان شاء الله

ربنا يوفقكم

تم تعديل هذه المشاركة بواسطة اسراء شلبى في 24 مايو 2010 في 21:30

00020309t.gif

1958_1963.gif
#35
MOHAMED FATHEI كتب:

اهلا بك اخى محمود

---------------------------------

اذا اكتبى رأيك فى الموضوع

كلمة واحدة ما كل هذا الكسل ؟ :lol:

تحياتى

اهلا بك اخى العزيز محمد

اسئلتك جميله ومتابعين ان شاء الله

لا الاستاذه اسراء مش بتكسل اوى هيا بتكسل كتير هههههههههه

لا هيا هتلاقيه متابعه بس وبعدين تجمع لينا كل حاجه وترد مره واحده

بس بالله عليكى براحه علينا :wacko: :wacko:

منتظرين

اسراء شلبى كتب:

احب ان اتابع من بعيد و ارى المناقشة و

اسألتك اخ محمد فى الصميم

انا بس بسجل متابعتى للموضوع

و كمان انا مش فاضية انا رايحة خطوبة صديقتى

عقبالكم؛؛؛؛؛الخطوبة و لا الموضوع يا اسراء>>>امممممم الموضوع طبعا لما ارجع ان شاء الله

ربنا يوفقكم

ألم اقل لك ذلك ؟

الف مبروك و عقبالى

قصدى عقبالك

وربنا يتمم بخير

Software Developer
Mahmoudkelany.com


 

#36

السلام عليكم

كيف حالكم يا شباب؟

يبدو أنه فاتني الكثير

ماشاء الله الشباب لم يقصروا وقاموا باللازم وزيادة قاموا بوضع TestCases أكثر من رائعة

بالنسبة لموضوع الإضافة لحزمة الأرقام

أولاً أحب أن أنوه إلى أن الحزمة أصلاً من كتابة الأخ محمد فتحي

كل ما قمت أنا هو تنقيح لها وجعلها آمنة لبيئة متعددة الخيوط

بالإضافة إلى بعض الدوال التي تستخدم لعملية فحص الأرقام العربية والتأكد منها

على كل أعتقد أنها إضافة أكثر من رائعة للحزمة

بالنسبة للفئة التي بين يدينا اليوم

تناقش ما يعرف بعملية التفقيط وسميت بهذا الاسم لأنها غالباً ما تلحق الكلمة فقط

مثال ألف ريال فقط

لدي إضافة بسيطة على الحزمة

معروف أن اللغة العربية تختلف في التعامل مع الأرقام على حسب التذكير والتأنيث

فاقترح أن يضاف للدالة متغير يعمل على توفير نسخة للذكر ونسخة للأنثى

بالنسبة لموضوع استخدام Number فالأمر يتلخص في التالي

Number هو الأب لجميع المغلفات Wrappers العددية

ومنها Integer و Double و Float و Short و BigDecimal و BigInteger

المشكلة الوحيدة التي تواجه من يستخدم هذه الفئة هي الأداء performance

دعوني أعطي مثال

لو فرضنا أني لدي كائن من النوع BigInteger

وأريد تفقيطه ما الذي سيحصل

أولاً سيتم تحويله casting إلى Number ثم يتم بناء كائن من النوع double باستخدام الدالة doubleValue

ماذا عن المتغيرات من الأنواع البدائية primitive variables

هنا يصبح الوضع أسوأ

حيث سيتم في البداية تعليبه autoboxing ومن ثم سيتم تحويله casting إلى Number ومن ثم يتم إنشاء كائن من النوع double باستخدام الدالة doubleValue

ستظهر هذه المشكلة بشكل واضح لو كنت تقوم بعملية التفقيط في تكرار

يبقى هنا نقطة يجب الإشارة إليها لو قمنا بما تفكرون به فنحن بحاجة إلى زيادة حجم الشيفرة وبالتالي زيادة حجم البرنامج في الذاكرة وعلى القرص الصلب

لذا أجد أننا في مواجهة خيارين أحلاهما مر

وبما أننا على الأغلب لن نستخدم التفقيط أكثر من مرة على الأغلب في شيفرتنا

كما أننا لا نعرف مدى كلفة العمليات التي تكلمنا عنها وأعتقد أن جافا تقوم بعملية تحسين لها لضمان تسريع البرامج إلى أقصى حد

فأعتقد أني أرجح كفة الأخ مازن واستخدام Number

بالنسبة لموضوع الأعداد الأكبر من العدد المتاح في الحزمة أرجح أن نرمي Exception وعلى المبرمج المستخدم للحزمة أن يقوم بمعالجته كيفما يشاء

(وهذه من أهم قواعد عمل API لا تقم بمعالجة الاستثناءات بناءاً على افتراضات هناك حالات لن تستطيع تغطيتها لذا أرفعها للطبقة الأعلى منك حتى تقوم بعمل ما يلزم)

تحياتي

1
حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#37

يا اخ محمد فتحي تصريحك لدالة تأخذ النوع double يعني انها قادرة على ترجمة اي رقم double بشكل صريح.

تخيل ان تكتب java doc او شرح لتلك الدالة , فماذا ستكتب؟ انها تترجم اعداد double ولكن ليس جميعها؟ هذا غير سليم من الناحية التصميمية ؟

نفس الشيء بالنسبة ل float .

هل ستكتب في الشرح ان اكبر قيمة تستطيع جميع الدوال قراءتها هي Long.MAX_VALUE ؟ اذا ما فائدة OverLoading?

تعريفك لدالة واحدة تأخذ متغير من نوع Number تفيد التجريد abstraction, بمعنى انها قادرة على ترجمة اي رقم مهما كان نوعة , مسألة الحد الاعلى والحد الأدني للأرقام الممكن ترجمتها تضعها انت للمستخدم في شرح الفئة.

اقتباس

وبالنسبة للنتيجة لاحظ هذا الرقم الكبير جدا ونتيجته

ستحصل على نفس النتيجة على اية حال.

تم تعديل هذه المشاركة بواسطة Dr.Robert في 24 مايو 2010 في 23:09

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#38
علاء الصالحي كتب:

السلام عليكم

كيف حالكم يا شباب؟

يبدو أنه فاتني الكثير

ماشاء الله الشباب لم يقصروا وقاموا باللازم وزيادة قاموا بوضع TestCases أكثر من رائعة

بالنسبة لموضوع الإضافة لحزمة الأرقام

أولاً أحب أن أنوه إلى أن الحزمة أصلاً من كتابة الأخ محمد فتحي

كل ما قمت أنا هو تنقيح لها وجعلها آمنة لبيئة متعددة الخيوط

بالإضافة إلى بعض الدوال التي تستخدم لعملية فحص الأرقام العربية والتأكد منها

على كل أعتقد أنها إضافة أكثر من رائعة للحزمة

بالنسبة للفئة التي بين يدينا اليوم

تناقش ما يعرف بعملية التفقيط وسميت بهذا الاسم لأنها غالباً ما تلحق الكلمة فقط

مثال ألف ريال فقط

لدي إضافة بسيطة على الحزمة

معروف أن اللغة العربية تختلف في التعامل مع الأرقام على حسب التذكير والتأنيث

فاقترح أن يضاف للدالة متغير يعمل على توفير نسخة للذكر ونسخة للأنثى

بالنسبة لموضوع استخدام Number فالأمر يتلخص في التالي

Number هو الأب لجميع المغلفات Wrappers العددية

ومنها Integer و Double و Float و Short و BigDecimal و BigInteger

المشكلة الوحيدة التي تواجه من يستخدم هذه الفئة هي الأداء performance

دعوني أعطي مثال

لو فرضنا أني لدي كائن من النوع BigInteger

وأريد تفقيطه ما الذي سيحصل

أولاً سيتم تحويله casting إلى Number ثم يتم بناء كائن من النوع double باستخدام الدالة doubleValue

ماذا عن المتغيرات من الأنواع البدائية primitive variables

هنا يصبح الوضع أسوأ

حيث سيتم في البداية تعليبه autoboxing ومن ثم سيتم تحويله casting إلى Number ومن ثم يتم إنشاء كائن من النوع double باستخدام الدالة doubleValue

ستظهر هذه المشكلة بشكل واضح لو كنت تقوم بعملية التفقيط في تكرار

يبقى هنا نقطة يجب الإشارة إليها لو قمنا بما تفكرون به فنحن بحاجة إلى زيادة حجم الشيفرة وبالتالي زيادة حجم البرنامج في الذاكرة وعلى القرص الصلب

لذا أجد أننا في مواجهة خيارين أحلاهما مر

وبما أننا على الأغلب لن نستخدم التفقيط أكثر من مرة على الأغلب في شيفرتنا

كما أننا لا نعرف مدى كلفة العمليات التي تكلمنا عنها وأعتقد أن جافا تقوم بعملية تحسين لها لضمان تسريع البرامج إلى أقصى حد

فأعتقد أني أرجح كفة الأخ مازن واستخدام Number

بالنسبة لموضوع الأعداد الأكبر من العدد المتاح في الحزمة أرجح أن نرمي Exception وعلى المبرمج المستخدم للحزمة أن يقوم بمعالجته كيفما يشاء

(وهذه من أهم قواعد عمل API لا تقم بمعالجة الاستثناءات بناءاً على افتراضات هناك حالات لن تستطيع تغطيتها لذا أرفعها للطبقة الأعلى منك حتى تقوم بعمل ما يلزم)

تحياتي

اعجبنى ردك الرائع اخى الكريم

لك منى كل تقدير واحترام

اقتباس
فاقترح أن يضاف للدالة متغير يعمل على توفير نسخة للذكر ونسخة للأنثى

كيف يتم ذلك اخى ؟

اقتباس
(وهذه من أهم قواعد عمل API لا تقم بمعالجة الاستثناءات بناءاً على افتراضات هناك حالات لن تستطيع تغطيتها لذا أرفعها للطبقة الأعلى منك حتى تقوم بعمل ما يلزم)

جميل جدا

تحياتى

Software Developer
Mahmoudkelany.com


 

#39

متغير Enum أو boolean كمدخل للدالة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#40
Dr.Robert كتب:

يا اخ محمد فتحي تصريحك لدالة تأخذ النوع double يعني انها قادرة على ترجمة اي رقم double بشكل صريح.

تخيل ان تكتب java doc او شرح لتلك الدالة , فماذا ستكتب؟ انها تترجم اعداد double ولكن ليس جميعها؟ هذا غير سليم من الناحية التصميمية ؟

نفس الشيء بالنسبة ل float .

هل ستكتب في الشرح ان اكبر قيمة تستطيع جميع الدوال قراءتها هي Long.MAX_VALUE ؟ اذا ما فائدة OverLoading?

الا ترى ان كلمة أكبر من كفيلة بهذا الموضوع

كما هو الحال مع Long فهى تترجم اقصى رقم ثم تضيف اليه جملة أكبر من

التى تفيد المستخدم بان الرقم الممرر للفئة تخطى هذا الرقم الخيالى

عموما انا كنت افضل استخدام الطريقة الاولى Number لاختصار الشفرة

ولكن

Dr.Robert كتب:

تخيل ان تكتب java doc او شرح لتلك الدالة , فماذا ستكتب؟ انها تترجم اعداد Number ولكن ليس جميعها؟ هذا غير سليم من الناحية التصميمية ؟

نفس المشكلة

واذا كان هذا حلها فى حالة Number

Dr.Robert كتب:

مسألة الحد الاعلى والحد الأدني للأرقام الممكن ترجمتها تضعها انت للمستخدم في شرح الفئة.

فهو نفس الحل فى حالة Double ايضا

علاء الصالحي كتب:

السلام عليكم

كيف حالكم يا شباب؟

يبدو أنه فاتني الكثير

ماشاء الله الشباب لم يقصروا وقاموا باللازم وزيادة قاموا بوضع TestCases أكثر من رائعة

يبدو انه فاتنا الكثير بتأخرك عن المشاركة معنا

ورجاء التوضيح اكثر بالنسبة لعملية التذكير والتأنيث اخى علاء

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#41
علاء الصالحي كتب:

متغير Enum أو boolean كمدخل للدالة

تحياتي

ليس ما اسال عنه

ولكن كيف افعل التذكير والتانيث ؟

وليس من حيث ان مثلا false يعنى مؤنث

او true تعنى مذكر

بصراحه يصعب عليا توضيح سوالى :wacko: :wacko:

ولكن اشرح لنا المزيد عن هذه الجزئيه

لو تكرمت

تحياتى

Software Developer
Mahmoudkelany.com


 

#42
اقتباس
(وهذه من أهم قواعد عمل API لا تقم بمعالجة الاستثناءات بناءاً على افتراضات هناك حالات لن تستطيع تغطيتها لذا أرفعها للطبقة الأعلى منك حتى تقوم بعمل ما يلزم)
+1
#43

بعد قراءة الموضوع بشكل ممل

ارى ان ما فعله الاخ مازن صحيح و الله اعمل

يعنى عنده حق...... :lol: فى استخدام number بدلا من كل الاقتراحات التى طرحها الاخوة

ارى ان ردوده مقنعة بشكل كافى

تم تعديل هذه المشاركة بواسطة اسراء شلبى في 25 مايو 2010 في 00:41

00020309t.gif

1958_1963.gif
#44
اسراء شلبى كتب:

بعد قراءة الموضوع بشكل ممل

ارى ان ما فعله الاخ مازن صحيح و الله اعمل

يعنى عنده حق...... :lol: فى استخدام number بدلا من كل الاقتراحات التى طرحها الاخوة

ارى ان ردوده مقنعة بشكل كافى

انا قولت كدا

المهم فعلا انا كمان مقتنع بكدا

وكدا 3 مقتنعين الاخ علاء و الاستاذه اسراء والعبد الفقير وصاحب الموضوع الاخ مازن طبعا اكيد مقتننع

اين باقى الاراء ؟؟؟

وهل هناك اصرار على عمل overloading ?

هناك فكره وحابب اطرحها عليكم

هل يمكنا فعل توصيف كما هو موجود هكذا فى الداله Number?

انظر الى الجزء المحدد فى الصوره

30973.jpg

وبالتالى يمكن للمستخدم معرفه الكثير عن الداله اللتى تحول الارقام الى كتابه نصية

مجرد فكره

تحياتى

1

Software Developer
Mahmoudkelany.com


 

#45
اقتباس
واذا كان هذا حلها فى حالة Number

فهو نفس الحل فى حالة Double ايضا

بالطبع لا , Double هو نوع من الأرقام لة حدودة التي يفترض ان تلتزم بها. لا يتوقع المستخدم منك ان تضع حدود مختلفة (وإلا لم استخدمتة ؟)

Number هو فئة "مجردة" لا حدود لها , ليس لها "اقل" قيمة او "اكبر" قيمة معروفة , لذلك من الطبيعي ان ينتظر منك المستخدم ان تعرف لة حدود معينة .

اقتباس

أولاً سيتم تحويله casting إلى Number

لا اتفق معك في هذا يا علاء لأن casting يحصل من الأب الى الإبن وليس العكس .

كل BigInteger هو في النهاية Number ولا حاجة للCasting ,والعكس غير صحيح لذلك نحتاج للcasting (والذي قد لا ينجح ويرمي ClassCastException)

تم تعديل هذه المشاركة بواسطة Dr.Robert في 25 مايو 2010 في 01:55

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#46

لا أعرف بالضبط لكني على حسب ما أذكر أن هناك نوعان من عملية التحويل نوع يعرف بالتحويل القسري أو ما تتكلم عنه أخ مازن ونوع يعرف بالتحويل التلقائي nested casting

والسبب في حاجتنا إليه هي أن الدالة تأخذ متغير من نوع Number

ونحن لدينا متغير من النوع BigInteger

لذا يجب علينا أن نخبر الدالة أن المتغير الموجود يصلح كمدخل لها

على كل كما قلت أنا لست متأكداً من هذا الكلام

بالنسبة لموضوع استخدام double فأنا لا أرى الحدود مشكلة بأي حال من الأحوال

على من يستخدم API الخاصة بي أن يلتزم بوصف الـ API

صحيح أنك كمبرمج حزم يجب أن تسهل عليه الموضوع قدر المستطاع لكن لا مانع من وجود بعض التحديدات التي تضعها أنت

وأنت حر في ذلك وعلى المتضرر رفع شكوى عليك ولن يعتبرها أحد :lol:

بالنسبة لموضوع التذكير والتأنثير

اللغة العربية تتعامل مع الأرقام على أساس التمييز الذي يلحق بها

فمثلاً لو قلنا أننا نقوم بالتفقيط للريال

مثال

اثنان وعشرون ريالاً فقط

فالريال هنا مذكر

أما لو قلنا أن نفقط للبيطيخ والبطيخ هنا مؤنث

فسيصبح اثنتان وعشرون بطيخة فقط

الموضوع يحتاج إلى متغير يحكم حالات التذكير والتأنيث

لكننا بحاجة إلى متطوع في اللغة العربية حتى يخبرنا بهذه الحالات

أنا لا أذكر شيئاً عن الموضوع ربما أستعين بالأخ إيهاب للتوضيح

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#47
Eng.Hamzawy كتب:

وكدا 3 مقتنعين الاخ علاء و الاستاذه اسراء والعبد الفقير وصاحب الموضوع الاخ مازن طبعا اكيد مقتننع

اين باقى الاراء ؟؟؟

وهل هناك اصرار على عمل overloading ?

انا ايضا كان معى الاخوة هويدى والعيافى وكنا قوة ضاربة لكن تركونى وحدى :wacko:

Dr.Robert كتب:

بالطبع لا , Double هو نوع من الأرقام لة حدودة التي يفترض ان تلتزم بها. لا يتوقع المستخدم منك ان تضع حدود مختلفة (وإلا لم استخدمتة ؟)

يا اخى انا لم اضع حدود للمستخدم فبامكانه ادخال اى رقم يريد ويتم ترجمته بالفعل

واذا تخطى اقصى قيمة تظهر جملة أكبر من وهى كافية حتى الان

والحدود عندى انا داخل الحزمة لحين التطوير وانتاج الاصدار الثانى منها

علاء الصالحي كتب:

بالنسبة لموضوع استخدام double فأنا لا أرى الحدود مشكلة بأي حال من الأحوال

على من يستخدم API الخاصة بي أن يلتزم بوصف الـ API

صحيح أنك كمبرمج حزم يجب أن تسهل عليه الموضوع قدر المستطاع لكن لا مانع من وجود بعض التحديدات التي تضعها أنت

وأنت حر في ذلك وعلى المتضرر رفع شكوى عليك ولن يعتبرها أحد :lol:

+1

علاء الصالحي كتب:

بالنسبة لموضوع التذكير والتأنيث

اللغة العربية تتعامل مع الأرقام على أساس التمييز الذي يلحق بها

فمثلاً لو قلنا أننا نقوم بالتفقيط للريال

مثال

اثنان وعشرون ريالاً فقط

فالريال هنا مذكر

أما لو قلنا أن نفقط للبطيخ والبطيخ هنا مؤنث

فسيصبح اثنتان وعشرون بطيخة فقط

الموضوع يحتاج إلى متغير يحكم حالات التذكير والتأنيث

لكننا بحاجة إلى متطوع في اللغة العربية حتى يخبرنا بهذه الحالات

أنا لا أذكر شيئاً عن الموضوع ربما أستعين بالأخ إيهاب للتوضيح

تحياتي

فكرة جميلة اخى علاء

وارى ان تستعين بالاخ ايهاب ( العربى عندنا أبيض :lol:)

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#48
علاء الصالحي كتب:

بالنسبة لموضوع استخدام double فأنا لا أرى الحدود مشكلة بأي حال من الأحوال

على من يستخدم API الخاصة بي أن يلتزم بوصف الـ API

صحيح أنك كمبرمج حزم يجب أن تسهل عليه الموضوع قدر المستطاع لكن لا مانع من وجود بعض التحديدات التي تضعها أنت

وأنت حر في ذلك وعلى المتضرر رفع شكوى عليك ولن يعتبرها أحد :lol:

بالنسبة لموضوع التذكير والتأنثير

اللغة العربية تتعامل مع الأرقام على أساس التمييز الذي يلحق بها

فمثلاً لو قلنا أننا نقوم بالتفقيط للريال

مثال

اثنان وعشرون ريالاً فقط

فالريال هنا مذكر

أما لو قلنا أن نفقط للبيطيخ والبطيخ هنا مؤنث

فسيصبح اثنتان وعشرون بطيخة فقط

الموضوع يحتاج إلى متغير يحكم حالات التذكير والتأنيث

لكننا بحاجة إلى متطوع في اللغة العربية حتى يخبرنا بهذه الحالات

أنا لا أذكر شيئاً عن الموضوع ربما أستعين بالأخ إيهاب للتوضيح

تحياتي

+1

منتظرين بطل اللغه العربيه

الاخ العزيز ايهاب

بس ليه البطيخ يعنى ما بلاش بطيخ :lol: :lol: :lol: :lol:

MOHAMED FATHEI كتب:

انا ايضا كان معى الاخوة هويدى والعيافى وكنا قوة ضاربة لكن تركونى وحدى :wacko:

معلش بقا ربنا معاك :wacko: :wacko: :wacko:

Software Developer
Mahmoudkelany.com


 

#49

السلام عليكم ورحمة الله وبركاته...

طبتم وطاب مسعاكم وممشاكم وتبوأتم من الجنة مقعداً ،

وبعد فإنه رغم ضعفي الشديد في مجال اللغة العربية فما يكون لي إلا أن ألبي نداء أخي علاء وبقية الإخوة الكرام جعلني الله خيراً مما يقوقون وغفر لي ما لا يعلمون.

================

كما قال الأخ علاء حفظه الله فلغتنا تفرق في العدد تأنيثاً وتذكيراً أو جمعاً وإفراداً بحسب المعدود

فعد الأولاد ، يختلف عن عد البنات "بلاش البطيخ :lol:"

والاختلاف يكون في العدد (سبع أو سبعة) وكذلك في المعدود (ولدٍ - ولداً - أولادٍ)

والعبرة في التفرقة بين الحالات هو بمفرد المعدود ، وهذه نقطة مهمة جداً فمثلاً كلمة مثل "جنيهات" هي مؤنثة ولكننا سنعاملها على أنها مذكر لأن مفردها كذلك "جنيه"

فهيا بنا نقسم الأرقام إلى مجموعات لنتعرف كيف يتم كتابتها بصورة صحيحة والله المعين :

1- الواحد والاثنان يوافقان مفرد المعدود تذكيراً أو تأنيثاً

ولد واحد و ولدان اثنان

بنت واحدة وبنتان اثنتان

2- الأعداد من ثلاثة إلى تسعة تخالف مفرد المعدود تذكيراً أو تأنيثاً

ثلاثة أولادٍ

ثلاث بناتٍ

ويكون المعدود في صيغة الجمع المجرور (أولادٍ / بناتٍ)

3- العشرة لها حالتان

أ- إن كانت مركبة مع غيرها (أحد عشر .... إلى تسعة عشر)

فالعشرة توافق المعدود ، والعدد المركب معها على قاعدته تبعاً للفئتين السابقتين

أحد عشر ولداً ... إحدى عشرة بنتاً

إثنا عشر ولداً ... إنتا عشرة بنتاً

ثلاثة عشر ولداً ... ثلاث عشرة بنتاً .... وهكذا الى 19

ويكون المعدود في كل ما سبق مفرداً منصوباً (ولداً / بنتاً)

ب- إن كانت مفردة فهي تخالف المعدود (تماماً كالفئة رقم 2)

عشرة أولادً

عشر بناتً

ويكون المعدود أيضاً في صيغة الجمع المجرور (أولادٍ / بناتٍ)

4- ألفاظ العقود (عشرون -ثلاثون - إلى تسعين)

ثابتة لاتتغير

عشرون ولداً وعشرون بنتاً - ويكون المعدود مفرداً منصوباً (ولداً / بنتاً)

فإذا تركب العدد مع عدد اخر فالعدد الاخر يتبع فئته السابق بيانها

واحد وعشرون ولداً - إحدى وعشرون بنتاً

ثلاثة وعشرون ولداً - ثلاث وعشرون بنتاً

5- المائة و مضاعفاتها مائتان - ثلاثمائة...الى تسعمائة

ثابتة أيضاً لا تتغير

مائة ولدٍ (بنتً)

مائتا ولد (بنت) .... لاحظ مائتا وليس مائتان

6- الألف ثابتة ولو تركبت مع عدد اخر (ثلاث الاف مثلاً) فالعدد الاخر يتبع فئته

======

هذه هي الفئات والأعداد بالطبع قد تكون مركبة من أكثر من فئة

11253

هيا نحاول...

أحد عشر ألفاً ومائتان وثلاثة وخمسون ولداً

إحدى عشرة ألفاً ومائتان وثلاث وخمسون بنتاً

========

أرجوا أن أكون قد قدمت يئاً ذا فائدة

موفقون إن شاء الله

تم تعديل هذه المشاركة بواسطة ايهاب عثمان في 25 مايو 2010 في 12:36

2

طبتم واهتديتم :)

===================================

إقرأ معي

رابط متجدد لكتاب أقرؤه فشاركني فيه

======

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

الكتاب :

حسين الموسوي - لله تم للتاريخ ، كشف الأسرار وتبرئة الأئمة الأطهار

اضغط على الصورة لتحميل الكتاب

%E1%E1%E5%20%CB%E3%20%E1%E1%CA%C7%D1%ED%CE.jpg

-----------

كتب سابقة

سعد الدين الشاذلي - مذكرات حرب أكنتوبر

#50

يا سلااااااام عليك يا استاذ ايهاب

اعتقد بعد كدة مالناش حجة :lol: , وللا اية يا جماعه

لنبدأ دراسة اقترا ح الأخ علاء وبمساعدة الاستاذ ايهاب فورا.

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…