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

تحويل متغير نصي الى عدد صحيح طبيعي

بدأه youssefchou في 31 أغسطس 2011 · 9 رد · 1,480 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الكود الذي استعملته باختصار

<?php

$var=9323242424;

echo $var."<br/>";
echo (int)$var;
?>

النتيجة التي احصل عليها بعد استعمال casting

9323242424
733307832

ما الخطأ هنا ? :wacko:

لقد وجدت الخطأ : العدد 9323242424 يتجاوز اقصى قيمة يمكن لمتغير من نوع integer ان ياخدها

لذا سوف اغير السؤال كيف اتعامل مع الاعداد الكبيرة ? على الاقل 64bits

تم تعديل هذه المشاركة بواسطة youssefchou في 31 أغسطس 2011 في 04:36

#2

عفوا، قمت بعمل is_double للمتغير

فاتضح انه ليس نصي بل من نوع double

#3

السلام عليكم.

للأسف PHP ليست للتعامل أبدًا مع الأرقام الكبيرة!

عمومًا هناك حل (و غالبًا هو الحل الوحيد إذا أردت أن يكون رقمًا لا رقمًا على نوع نص)، الحل مدعوم على أغلب خوادم الويب تقريبًا أو الكثير منها، لكن قد لا يعمل على بعض خوادم الويب.

الكود:

<?php

$var = '932324242422222';
echo bcadd($var, '0');

?>

الكود السابق سيخرج الرقم المكتوب كنص على شكل رقم، عمومًا عندما تريد التعامل مع هذا الرقم سيكون عليك استعماله كنص و استعمال دالة bcadd للجمع، و bcmul للضرب، و bcsub للطرح، و bcdiv للقسمة.

و نتيجة هذه الدوال تكون عبارة عن أرقام لا نصوص. (تعديل: الواضح أن النتيجة عبارة عن نصوص من حيث النوع، على شكل أرقام كذلك!)

شكرًا.

تم تعديل هذه المشاركة بواسطة sitesmaker في 1 سبتمبر 2011 في 14:00

#4

بارك الله فيك ليس من المعقول ان تبقى لغة كهذه دون ارقام كبيرة

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

شكرا لك وفعلا الدالة bcadd تقوم بالعمل

#5

سأحاول قريبًا بإذن الله تعالى، بناء دوال (بـPHP) تقوم بالحسابات بشكل ما (ربما بالاعتماد على الرقم كنص، أو كمصفوفة)، و إن نجحت إن شاء الله، سيكون علي إدماجها في لغة منشئ المواقع دون استعمالها كدوال، و لكن عند كتابة 1 + 1 يتم نداء الدالة عليها آليًا. ما رأيك؟

#6

فكرة جيدة !!

ولكن حسب ما قرأته فان الoperator overloading محدودة في الPHP وغير مدعومة جيدا

ولكن هناك امكانية لعمل دلك باستعمال اضافة PECL

http://pecl.php.net/package/operator

ان استطعت ادراجها في اللغة فاعتقد عنده يمكنك عمل operator overloading

صح ؟

او ربما لن تحتاج الى الopertor overloading بصفة مباشرة لاننا بصدد لغة جديدة, مثلا في ملف الgenerator.php (SMPL-01 ) الذي كتبته يمكن الاستفادة من السطر 78

case "PLUS_SIGN": $code.="+"; break;

عوض تهيئة المتغير $code تقوم باستدعاء الدالة bcadd ممرا لها القيمتين النصيتين ?

تم تعديل هذه المشاركة بواسطة youssefchou في 1 سبتمبر 2011 في 18:16

#7

السلام عليكم.

وجدت شيء جديد (لكن كذلك له حدود، عمومًا حدوده كبير نوعًا ما مقارنة بالطريقة العادية):

<?php
echo number_format(10000000000000000 + 2, 0, '', '');
?>

المصدر: http://www.daniweb.c.../threads/269141

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

أما الاصدار الشبه مكتمل إن شاء الله 0.3، فهو مختلف تمامًا، فيمرر جميع العمليات الحسابية إلى دوال خاصة باللغة، فتتيح لك أن تكتب ما تشاء و تجد النتيجة المتوقعة بكل مرونة، مثلًا array1 + array2! بل و string1 <= string2!! أي شيء تقريبًا يخطر على بالك و له معنى صحيح يمكن إن شاء الله، و بنتيجة صحيحة إن شاء الله. القليل من المذكور مدعوم بالفعل في الاصدار الموجود في الموقع، لكن طريقته ركيكة و النتيجة قد تكون خاطئة في بعض الأوقات، و كذلك يعتمد على PHP بشكل كبير! بينما الاصدار الجديد يعتمد على اللغة نفسها لإجراء المقارنات و العمليات الحسابية و الكثير من الأشياء! (عمومًا اللغة تصبح أبطأ كذلك!)

كذلك كما أخبرتك سيكون strong typed، لتوفير قوة و مرونة و نظام أكبر إن شاء الله.

بالنسبة لاستخدام دالة bcadd، باختصار الأمر ليس بهذه السهولة، هناك كما ذكرت حسابات بين أشياء ليست أرقام، و هذه الدالة غير مدعومة على جميع الاصدارات، و هذه الدوال تعيد قيمة نصية لا رقمية! و كذلك ربما نكتب 1 + 1 * 2 إذا حولناها واحدة تلو الأخرى بالترتيب المكتوب سيكون لدينا نتيجة خاطئة و هي 4، بينما الصحيحة 3! نقطة أخرى بدلًا من كتابة رقم قد يتم كتابة نداء لدالة، داخل تلك الدالة عملية حسابية أخرى، مثال:

show my_number + abc( 1 * 3, 20 / 2 + xyz( 1 + 2 ) ) * 9;

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

أعتذر للخروج عن الموضوع، و ذكر منشئ المواقع أكثر من مرة، يمكنني تعديل المشاركات إن أردت.

شكرًا.

تم تعديل هذه المشاركة بواسطة sitesmaker في 1 سبتمبر 2011 في 22:30

#8

لا مافي مشكلة ابدا ولا داعي لتعديل اي شيء فكل ما له علاقة بالموضوع هو اثراء له

في انتضار الاصدار الاخر

بالتوفيق

تم تعديل هذه المشاركة بواسطة youssefchou في 1 سبتمبر 2011 في 22:29

#9

في PHP

32 بت اقصى حد له 2147483647

64 بت اقصى حد له 9223372036854775807

Integers

في المثال الذي وضعته

تعامل مع العدد على انه نص بهذا الشكل

<?php
$var=9323242424;

echo $var."<br/>";
echo (string)$var;


?>

وراح يطبعه لك بشكل سليم

والميز في لغة PHP انه ممكن اجمع متغيرين من نوع string

مثال

<?php
$x = '2';
$y = '3';

echo $x + $y; // output  = 5


?>

وااذا تبغى تفرض انو المتغير لازم يكون رقم يعني تسوي casting هنا ممكن تستخدم التعابير القياسية Regular Expression

وراح تحل مشكلتك بكل بساطة

بالتوفيق اخي الكريم

^_^

تم تعديل هذه المشاركة بواسطة M.B.O في 2 سبتمبر 2011 في 00:02

M.B.O

Mohamed Bin Othman

إبن المكلا

يابني البشر ماذا فعلتم بالبشر !!

إسـألـنـي

#10

السلام عليكم أخي M.B.O، فكرتك جميلة.

لكن جرب الكود التالي:

<?php
echo '100000000000000' + '2';
?>

لن يعمل بالشكل المطلوب (علمًا بأني أجرب على جهاز 32-Bit).

أقصد أن الجمع بين نصين محتوياتهما أرقام، لا يحل المشكلة. الحل الوحيد المتاح في PHP، هو دوال bc أو دوال gmp و الثانية غير مدعومة إلا على قليل من الخوادم، و الأولى ليست مدعومة على جميع الخوادم لكن أكثرها.

شكرًا.

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