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

[ تمت الإجابة ]دالة التفقيط للأرقام الصحيحة و العشرية

بدأه azhran في 20 يناير 2012 · 11 رد · 4,149 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

#2

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

أكتب الدالة التى قمت بعملها وسنقوم بتعديل ما يلزم عليها للتعامل مع الأرقام العشرية إن شاء الله

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

لا إله إلا أنت سبحانك إني كنت من الظالمين

#3

تنفيذ الدالة مرتبط بجداول في قاعدة البيانات و لا استطيع ان ارفع قاعدة البيانات لأن فيها بيانات هامة و ممكن تقول عليها اسرار لمنظمة حكومية و كمان انا مش عاوز استخدم الدالة دي لأنها بتجيب البيانات من قاعدة البيانات و انا عارف اني ممكن اعمل التفقيط بعيد عن قاعدة البيانات و هوا دا طلبي - دالة تفقيط مستقلة يمكن و ضعها في اى برنامج بدون الاتصال بقاغدة البيانات و شكرا

#4

أخى الكريم لماذا لم تعمل معك مكتبة الأخ خالد شمعة

وهى على الرابط التالى :

http://www.ar-php.org/ar-example-Numbers-php-arabic.html

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

لا إله إلا أنت سبحانك إني كنت من الظالمين

#5

شكرا على الرد يا أخ / أحمد لكن لو قريت الموضوع من البداية هتلاقيني اني حاولت اجرب مكتبة الأخ خالد شمعة لكني لم استطع استخدامها فلو عند حضرتك مثال لأستخدامها مع العلم اني استخدم بي اتش بي الاصدار 4.4.4 في البرمجة و لي الاصدار الخامس و شكرا مرة اخرى للرد و في انتظار الردود

#6

اخي جرب هذه الدالة , انا استخدمتها تقريبا ً من قبل شي ثلاث سنوات اعتقد فيها بعض الاخطاء بس ناسي ايش هي بالضبط , عموما ً انت جربها يمكن تزبط معك

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

function makeNumber2Text($numberValue){ 

    $textResult = ''; // so i can use .= 
    $numberValue = "$numberValue"; 

    if($numberValue[0] == '-'){ 
        $textResult .= 'سالب '; 
        $numberValue = substr($numberValue,1); 
    } 

    $numberValue = (int) $numberValue;     
    $def = array(    "0" => 'صفر', 
                    "1" => 'واحد', 
                    "2" => 'اثنان', 
                    "3" => 'ثلاث', 
                    "4" => 'اربع', 
                    "5" => 'خمس', 
                    "6" => 'ست', 
                    "7" => 'سبع', 
                    "8" => 'ثمان', 
                    "9" => 'تسع', 
                    "10" => 'عشر', 
                    "11" => 'أحد عشر', 
                    "12" => 'اثنا عشر', 
                    "100" => 'مائة', 
                    "200" => 'مئتان', 
                    "1000" => 'ألف', 
                    "2000" => 'ألفين', 
                    "1000000" => 'مليون', 
                    "2000000" => 'مليونان'); 

    // check for defind values     
    if(isset($def[$numberValue])) { 
        // checking for numbers from 2 to 10 :reson = 2 to 10 uses 'ة' at the end 
        if($numberValue < 11 && $numberValue > 2){ 
            if ($numberValue == 8 )
                $textResult .= $def[$numberValue].'ية'; 
            else 
                $textResult .= $def[$numberValue].'ة'; 
        } 
        else{ 
            // the rest of the defined numbers 
            $textResult .= $def[$numberValue]; 
        } 
    } 
    else{ 
        $tensCheck = $numberValue%10; 
        $numberValue = "$numberValue"; 

        for($x = strlen($numberValue); $x > 0; $x--){ 
            $places[$x] = $numberValue[strlen($numberValue)-$x]; 
        } 

        switch(count($places)){ 
            case 2: // 2 numbers 
            case 1: // or 1 number 
            { 
                if ($places[1] == 8 )
                $textResult .= ($places[1] != 0) ? $def[$places[1]].(($places[1] > 2 || $places[2] == 1) ? 'ية' : '').(($places[2] != 1) ? ' و' : ' ') : ''; 
                else 

                $textResult .= ($places[1] != 0) ? $def[$places[1]].(($places[1] > 2 || $places[2] == 1) ? 'ة' : '').(($places[2] != 1) ? ' و' : ' ') : ''; 
                $textResult .= (($places[2] > 2) ? $def[$places[2]].'ون' : $def[10].(($places[2] != 2) ? '' : 'ون'));                 
            } 
            break; 
            case 3: // 3 numbers 
            { 
                $lastTwo = (int) $places[2].$places[1]; 
                $textResult .= ($places[3] > 2) ? $def[$places[3]].' '.$def[100] : $def[(int) $places[3]."00"]; 
                if($lastTwo != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastTwo); 
                } 
            } 
            break;  
            case 4: // 4 numbrs 
            { 
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= ($places[4] > 2) ? $def[$places[4]].'ة الاف' : $def[(int) $places[4]."000"]; 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 5: // 5 numbers 
            {     
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= makeNumber2Text((int) $places[5].$places[4]).((((int) $places[5].$places[4]) != 10) ? ' الفاً' : ' الاف'); 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 6: // 6 numbers 
            {     
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= makeNumber2Text((int) $places[6].$places[5].$places[4]).((((int) $places[5].$places[4]) != 10) ? ' الفاً' : ' الاف'); 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 7: // 7 numbers 1 mill 
            {     
                $textResult .= ($places[7] > 2) ? $def[$places[7]].' ملايين' : $def[(int) $places[7]."000000"]; 
                $textResult .= ' و'; 
                $textResult .= makeNumber2Text((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]); 
            } 
            break; 
            case 8: // 8 numbers 10 mill 
            case 9: // 9 numbers 100 mill 
            {     
                $places[9] = (isset($places[9])) ? $places[9] : ''; 
                $firstThree = (int) $places[9].$places[8].$places[7]; 
                $textResult .=     makeNumber2Text($firstThree); 
                $textResult .=    ($firstThree < 11) ? ' ملايين ' : ' مليونا '; 
                if(((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]) != 0){ 
                    $textResult .= ' و'; 
                    $textResult .=    makeNumber2Text((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]); 
                } 
            } 
            break; 
            default: 
            { 
                $textResult = 'هذا رقم كبير .. '; 
            } 
        } 

    } 
    return $textResult; 
}

M.B.O

Mohamed Bin Othman

إبن المكلا

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

إسـألـنـي

#7
M.B.O كتب:

اخي جرب هذه الدالة , انا استخدمتها تقريبا ً من قبل شي ثلاث سنوات اعتقد فيها بعض الاخطاء بس ناسي ايش هي بالضبط , عموما ً انت جربها يمكن تزبط معك

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

function makeNumber2Text($numberValue){ 

    $textResult = ''; // so i can use .= 
    $numberValue = "$numberValue"; 

    if($numberValue[0] == '-'){ 
        $textResult .= 'سالب '; 
        $numberValue = substr($numberValue,1); 
    } 

    $numberValue = (int) $numberValue;     
    $def = array(    "0" => 'صفر', 
                    "1" => 'واحد', 
                    "2" => 'اثنان', 
                    "3" => 'ثلاث', 
                    "4" => 'اربع', 
                    "5" => 'خمس', 
                    "6" => 'ست', 
                    "7" => 'سبع', 
                    "8" => 'ثمان', 
                    "9" => 'تسع', 
                    "10" => 'عشر', 
                    "11" => 'أحد عشر', 
                    "12" => 'اثنا عشر', 
                    "100" => 'مائة', 
                    "200" => 'مئتان', 
                    "1000" => 'ألف', 
                    "2000" => 'ألفين', 
                    "1000000" => 'مليون', 
                    "2000000" => 'مليونان'); 

    // check for defind values     
    if(isset($def[$numberValue])) { 
        // checking for numbers from 2 to 10 :reson = 2 to 10 uses 'ة' at the end 
        if($numberValue < 11 && $numberValue > 2){ 
            if ($numberValue == 8 )
                $textResult .= $def[$numberValue].'ية'; 
            else 
                $textResult .= $def[$numberValue].'ة'; 
        } 
        else{ 
            // the rest of the defined numbers 
            $textResult .= $def[$numberValue]; 
        } 
    } 
    else{ 
        $tensCheck = $numberValue%10; 
        $numberValue = "$numberValue"; 

        for($x = strlen($numberValue); $x > 0; $x--){ 
            $places[$x] = $numberValue[strlen($numberValue)-$x]; 
        } 

        switch(count($places)){ 
            case 2: // 2 numbers 
            case 1: // or 1 number 
            { 
                if ($places[1] == 8 )
                $textResult .= ($places[1] != 0) ? $def[$places[1]].(($places[1] > 2 || $places[2] == 1) ? 'ية' : '').(($places[2] != 1) ? ' و' : ' ') : ''; 
                else 

                $textResult .= ($places[1] != 0) ? $def[$places[1]].(($places[1] > 2 || $places[2] == 1) ? 'ة' : '').(($places[2] != 1) ? ' و' : ' ') : ''; 
                $textResult .= (($places[2] > 2) ? $def[$places[2]].'ون' : $def[10].(($places[2] != 2) ? '' : 'ون'));                 
            } 
            break; 
            case 3: // 3 numbers 
            { 
                $lastTwo = (int) $places[2].$places[1]; 
                $textResult .= ($places[3] > 2) ? $def[$places[3]].' '.$def[100] : $def[(int) $places[3]."00"]; 
                if($lastTwo != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastTwo); 
                } 
            } 
            break;  
            case 4: // 4 numbrs 
            { 
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= ($places[4] > 2) ? $def[$places[4]].'ة الاف' : $def[(int) $places[4]."000"]; 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 5: // 5 numbers 
            {     
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= makeNumber2Text((int) $places[5].$places[4]).((((int) $places[5].$places[4]) != 10) ? ' الفاً' : ' الاف'); 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 6: // 6 numbers 
            {     
                $lastThree = (int) $places[3].$places[2].$places[1]; 
                $textResult .= makeNumber2Text((int) $places[6].$places[5].$places[4]).((((int) $places[5].$places[4]) != 10) ? ' الفاً' : ' الاف'); 
                if($lastThree != 0){ 
                    $textResult .= ' و'.makeNumber2Text($lastThree); 
                } 
            } 
            break; 
            case 7: // 7 numbers 1 mill 
            {     
                $textResult .= ($places[7] > 2) ? $def[$places[7]].' ملايين' : $def[(int) $places[7]."000000"]; 
                $textResult .= ' و'; 
                $textResult .= makeNumber2Text((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]); 
            } 
            break; 
            case 8: // 8 numbers 10 mill 
            case 9: // 9 numbers 100 mill 
            {     
                $places[9] = (isset($places[9])) ? $places[9] : ''; 
                $firstThree = (int) $places[9].$places[8].$places[7]; 
                $textResult .=     makeNumber2Text($firstThree); 
                $textResult .=    ($firstThree < 11) ? ' ملايين ' : ' مليونا '; 
                if(((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]) != 0){ 
                    $textResult .= ' و'; 
                    $textResult .=    makeNumber2Text((int) $places[6].$places[5].$places[4].$places[3].$places[2].$places[1]); 
                } 
            } 
            break; 
            default: 
            { 
                $textResult = 'هذا رقم كبير .. '; 
            } 
        } 

    } 
    return $textResult; 
}

شكرا جزيلا للرد و لكن لي سؤال هل الدالة دي تدعم الارقام العشرية و لا لا لأني عندي دالة تقوم بالتفقيط لكن للأسف لا تدعم الارقام العشرية فياريت تكون الدالة بتاعتك بتدعم الموضوع داو شكرا

#8

السلام عليكم

الدالة السابقة لا تدعم الأرقام العشرية ويمكن التعديل عليها لجعلها تدعم الأرقام العشرية كما يلى :

تم إضافة فنكشن باسم ()Dot للمثال السابق للتعديل عليه

قم بإضافة تلك الدالة للكود السابق داخل نفس الملف :

function Dot($Value){
if(!isset($Value))
return "لم يتم إدخال أى أرقام";
$StrValue=(string)$Value;
$Dot=False;
$Text1="";
$Text2="";
for($i=0;$i<strlen($StrValue);$i++)
		{
		if($StrValue[$i]=="."){
		$Dot=True;
		}
		if($StrValue[$i]!="."){
		if($Dot==False)
		$Text1.=$StrValue[$i];
		else
		$Text2.=$StrValue[$i];
		}
		}
		if($Dot==False)
		return makeNumber2Text($StrValue);
		else 
		return makeNumber2Text((int)$Text1)." فاصلة ".makeNumber2Text((int)$Text2);

}

ولكن بعد ذلك التعديل قم بإستخدام الدالة الجديدة على سبيل المثال ;(echo Dot(155.633

ملاحظة : الدالة لا تتعامل مع الأصفار بعد العلامة لأنها تعتمد على الدالة الأساسية للتفقيط فى المثال السابق

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 23 يناير 2012 في 14:23

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

لا إله إلا أنت سبحانك إني كنت من الظالمين

#9

السلام عليكم

تم التعديل أخى الكريم على الدالة السابقة لكى تقبل الأصفار بعد العلامة وعلى سبيل المثال تكون الصيغة على النحو التالى "122.025" هى "مائة واثنان وعشرون فاصلة خمسة وعشرون من ألف"

إليك كود الدالة :

function Dot($Value){
if(!isset($Value))
return "لم يتم إدخال أى أرقام";
$DotArray= array("","عشرة","مائة","ألف","عشرة ألاف","مائة ألف","مليون","عشرة ملايين","مائة مليون","مليار");
$StrValue=(string)$Value;
$DotLens=0;
$Dot=False;
$Text1="";
$Text2="";
for($i=0;$i<strlen($StrValue);$i++)
		{
		if($StrValue[$i]=="."){
		$Dot=True;
		}
		if($StrValue[$i]!="."){
		if($Dot==False)
		$Text1.=$StrValue[$i];
		else{
		$Text2.=$StrValue[$i];
		$DotLens++;
		    }
		  }
		}
		if($Dot==False)
		return makeNumber2Text($StrValue);
		else {
		if($DotLens>0 && $DotLens<10)
		return makeNumber2Text((int)$Text1)." فاصلة ".makeNumber2Text((int)$Text2)." من ".$DotArray[$DotLens];
		else
		return makeNumber2Text((int)$Text1)." فاصلة ".makeNumber2Text((int)$Text2);
		}
}

ملحوظة : مدى تلك الدالة هو نفس مدى الدالة الأساسية من جهة الأرقام الصحيحة أو الكسرية أى نفس خانات الأرقام المسموح بها فى الدالة التى أرفقها الأخ M.B.O .

NumbersByArabic.php

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 23 يناير 2012 في 08:02

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

لا إله إلا أنت سبحانك إني كنت من الظالمين

#10

المشكلة الحقيقية في حالة مكتبة PHP واللغة العربية أنها لم تعد تدعم الإصدار الرابع من لغة PHP و الذي توقف تطويره رسميا نهاية العام 2007 كما توقف دعمه تماما والإعلان عن نهاية حياته يوم 8 آب/أغسطس 2008، لذا أرى أنه من غير الحكمة تماما عدم الانتقال إلى الإصدار الخامس من هذه اللغة، فخيار محاولة البقاء على الإصدار القديم هو حكم بالموت البطيء، قد تحل المشكلة الحالية التي بين لديك، لكن رويدا رويدا ستظهر مشاكل جديدة أو مزايا جديدة تريد تطويرها فتنظر حولك ولا تجد أي أداة أو مكتبة أو قطعة برمجية تأخذ بعين الاعتبار إمكانية العمل على ذلك الإصدار القديم المتهالك.

أنا أعي تماما أنك معني بتعديل بسيط وليست ضمن سلطتك إتخاذ قرار الانتقال إلى الإصدار الجديد والذي إن أتخذ فهناك العديد من المراجع التي تعين على تنفيذ ذلك الانتقال منها على سبيل المثال المرجع الرسمي وهو Migrating from PHP 4 to PHP 5.0.x

على كل حال، بالنسبة لمكتبة PHP واللغة العربية أعتقد أنك بحاجة إلى الملف المدعو ArNumbers.class.php والموجود ضمن مجلد sub فهو الذي يتضمن التوابع الخاصة بعملية التفقيط، وأعتقد أن عدم التوافقية مع الإصدار السابق من لغة PHP مرده إلى استخدام الأمر simplexml_load_file والذي لم يكن موجودا في الإصدار الرابع وعليك تدبر أمرك في وضع طريقة مكافئة لعمله، تنبه إلى أنك بحاجة أيضا إلى ملف يدعى ArNumbers.xml موجود ضمن المجلد sub/data

حل آخر (سريع لكنه غير مثالي)، وهو العودة واستخدام النسخة القديمة من هذه المكتبة والتي كانت عاملة على الإصدار الرابع من لغة PHP والذي يمكن أن تجده على الرابط التالي:

Class: ArNumbers

أتمنى أن يكون ما كتب هنا مساعدا لك

1
#11
ahmedsaoud31 كتب:

السلام عليكم

تم التعديل أخى الكريم على الدالة السابقة لكى تقبل الأصفار بعد العلامة وعلى سبيل المثال تكون الصيغة على النحو التالى "122.025" هى "مائة واثنان وعشرون فاصلة خمسة وعشرون من ألف"

إليك كود الدالة :

function Dot($Value){
if(!isset($Value))
return "لم يتم إدخال أى أرقام";
$DotArray= array("","عشرة","مائة","ألف","عشرة ألاف","مائة ألف","مليون","عشرة ملايين","مائة مليون","مليار");
$StrValue=(string)$Value;
$DotLens=0;
$Dot=False;
$Text1="";
$Text2="";
for($i=0;$i<strlen($StrValue);$i++)
		{
		if($StrValue[$i]=="."){
		$Dot=True;
		}
		if($StrValue[$i]!="."){
		if($Dot==False)
		$Text1.=$StrValue[$i];
		else{
		$Text2.=$StrValue[$i];
		$DotLens++;
	    	}
	  	}
		}
		if($Dot==False)
		return makeNumber2Text($StrValue);
		else {
		if($DotLens>0 && $DotLens<10)
		return makeNumber2Text((int)$Text1)." فاصلة ".makeNumber2Text((int)$Text2)." من ".$DotArray[$DotLens];
		else
		return makeNumber2Text((int)$Text1)." فاصلة ".makeNumber2Text((int)$Text2);
		}
}

ملحوظة : مدى تلك الدالة هو نفس مدى الدالة الأساسية من جهة الأرقام الصحيحة أو الكسرية أى نفس خانات الأرقام المسموح بها فى الدالة التى أرفقها الأخ M.B.O .

الف الف شكر يا ahmedsaoud31 هوا دا اللي انا كنت بدور علية و لازم اشكر كل اللي ساهم و لو برد في الموضوع دا

#12

يا سيدي الفاضل اعتقد ان الموضوع مش ها يوصل للمليار هوا اخره اتنين و لا تلاتة مليون دا لو حصل اصلا و وصل للرقم دا :)

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

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

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

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

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