PDA

View Full Version : تکرار چاپ عدد به حروف در جاهای مختلف صفحه (حل شد)



ruhy
جمعه 29 فروردین 1393, 19:46 عصر
سلام دوستان یک فانکشن تبدیل عدد به حروف دارم که به صورت زیر هست :



function MoneyToLetters($Num)
{
function digit_to_persain_letters($money)
{
$one = array(
'صفر',
'یک',
'دو',
'سه',
'چهار',
'پنج',
'شش',
'هفت',
'هشت',
'نه');
$ten = array(
'',
'ده',
'بیست',
'سی',
'چهل',
'پنجاه',
'شصت',
'هفتاد',
'هشتاد',
'نود',
);
$hundred = array(
'',
'یکصد',
'دویست',
'سیصد',
'چهارصد',
'پانصد',
'ششصد',
'هفتصد',
'هشتصد',
'نهصد',
);
$categories = array(
'',
'هزار',
'میلیون',
'میلیارد',
);
$exceptions = array(
'',
'یازده',
'دوازده',
'سیزده',
'چهارده',
'پانزده',
'شانزده',
'هفده',
'هجده',
'نوزده',
);

if(strlen($money) > count($categories)*3){
throw new Exception('number is longger!');
}

$letters_separator = ' و ';
$money = (string)(int)$money;
$money_len = strlen($money);
$persian_letters = '';

for($i=$money_len-1; $i>=0; $i-=3){
$i_one = (int)isset($money[$i]) ? $money[$i] : -1;
$i_ten = (int)isset($money[$i-1]) ? $money[$i-1] : -1;
$i_hundred = (int)isset($money[$i-2]) ? $money[$i-2] : -1;

$isset_one = false;
$isset_ten = false;
$isset_hundred = false;

$letters = '';

// zero
if($i_one == 0 && $i_ten < 0 && $i_hundred < 0){
$letters = $one[$i_one];
}

// one
if(($i >= 0) && $i_one > 0 && $i_ten != 1 && isset($one[$i_one])){
$letters = $one[$i_one];
$isset_one = true;
}

// ten
if(($i-1 >= 0) && $i_ten > 0 && isset($ten[$i_ten])){
if($isset_one){
$letters = $letters_separator.$letters;
}

if($i_one == 0){
$letters = $ten[$i_ten];
}
elseif($i_ten == 1 && $i_one > 0){
$letters = $exceptions[$i_one];
}
else{
$letters = $ten[$i_ten].$letters;
}

$isset_ten = true;
}

// hundred
if(($i-2 >= 0) && $i_hundred > 0 && isset($hundred[$i_hundred])){
if($isset_ten || $isset_one){
$letters = $letters_separator.$letters;
}

$letters = $hundred[$i_hundred].$letters;
$isset_hundred = true;
}

if($i_one < 1 && $i_ten < 1 && $i_hundred < 1){
$letters = '';
}
else{
$letters .= ' '.$categories[($money_len-$i-1)/3];
}

if(!empty($letters) && $i >= 3){
$letters = $letters_separator.$letters;
}

$persian_letters = $letters.$persian_letters;
}

return $persian_letters;
}

// طبقه بندی بیشتر را به ابتدای لیست اضافه کنید
$categories = array(
'سکستیلیون',
'کوانتینیارد',
'کوانتینیوم',
'کادریلیارد',
'کادریلیون',
'تریلیارد',
'تریلیون',
'بیلیارد',
'بیلیون',
'میلیارد',
'میلیون',
'هزار',
'',
);

$Num3="";
$Num2=explode(',',number_format($Num));
for($i=0;$i<count($Num2);$i++)
{
if($Num2[$i] !=0 )
{
$Num3.=digit_to_persain_letters($Num2[$i]);
$Num3.=" ".$categories[count($categories)-count($Num2)+$i]." ";
}
if((($i<count($Num2)-1) && ($Num2[$i+1]) != "000")) $Num3.=" و ";

}



return $Num3;
}



وقتی میخاهیم فانکشن رو صدا بزنیم از طریق زیر عمل میکنیم :



echo MoneyToLetters($pkol)."ریال ";

اما اگر از یک متغیر دیگه در همین صفحه فانکشن رو صدا بزنیم عدد رو به حروف تبدیل نمیکنه

لطفا دوستان راهنمایی بفرمایند

ruhy
جمعه 29 فروردین 1393, 19:51 عصر
مثلا اگر تو همون صفحه


echo MoneyToLetters($move)."ریال ";



رو اکو کنیم چیزی نشون داده نمیشه

MMSHFE
جمعه 29 فروردین 1393, 20:13 عصر
چرا یک تابع رو توی یک تابع دیگه تعریف کردین؟ بهتره تابع داخلی رو بیرون بیارین.

ruhy
جمعه 29 فروردین 1393, 22:30 عصر
تابع داخلی رو بیرون اوردم اما کلا دیگه کار نمیکنه


دوستان راهی روش صحیحی

ruhy
جمعه 29 فروردین 1393, 22:32 عصر
اقا درست شد اشتباه تابع رو بیرون اورده بودم ممنون