PDA

View Full Version : آموزش: تابع تبدیل اعداد انگلیسی به فارسی



sabloger
دوشنبه 02 بهمن 1391, 00:53 صبح
با سلام خدمت دوستان و اساتید محترم

من برای کارهام نیاز داشتم که اعداد انگلیسی رو به فارسی تبدیل کنم، یعنی کلا به اعداد فارسی نیاز داشتم

برای همین یه سری جست و جو کردم
که به تابع های پیچیده و طولانی رسیدم
از جمله اونا تابعی بود که توی jdate بود
که بسیار طولانی و کند بود

برای همین خودم دست به کار شدم تا یه تابع خو بنویسم
حالا اونو با توضیح برای شما دوستان میگذارم






/** SABloger -- Function for convert EN nums to FA Nums **/

function SAENnum2FAnum($numstr)
{

$ConvertedStr = '';
for( $n = 0 ; $n <= strlen($numstr) ; $n++)
{
$ns = substr($numstr , $n , 1);
if(is_numeric($ns))
$ConvertedStr .= '&#17' . (28 + 48 + $ns);
}
return $ConvertedStr;
}





$numstr یک پارامتر رشته ایه که میتونه حاوی اعداد و حروف مختلط باشه
یعنی یه چیزی مثل این:
12as34xd5vvf67h89w0
که این تابع اعداد داخل متن رو میکشه بیرون و برای همچین رشته ای، این خروجی رو میده :
۱۲۳۴۵۶۷۸۹۰




if(is_numeric($ns))


میاد میبینه اگر کاراکتر جاری عدد بود، اجازه میده که فرایند تبدیل انجام بشه




$ConvertedStr .= '&#17' . (28 + 48 + $ns);



کد اعداد فارسی در html از 1776 شروع شده و به 1785 ختم میشن! یعنی 0 تا 9!
و اعداد لاتین از 48 تا 57 طبق قانون اسکی

پس من عدد جاری رو به 48 که عدد 0 لاتین میشه اضافه کردم
سپس به 28 که اختلاف 76 و 48 هست اضافه کردم تا یه عددی بین 76 تا 85 مبنی بر عدد جاری ساخته بشه

در نهایت اونو کنار &#17 گذاشتم تا کد عدد فارسی کامل بشه و به متن خروجی چسبوندم


امیدوارم که به کارتون بیاد
اساتید هم اگر اشکالی در کد دیدند خوشحال میشم راهنماییم کنند

با آرزوی موفقیت روز افزون برنامه نویسان ایران زمین

habibvafapour
دوشنبه 02 بهمن 1391, 01:11 صبح
کارت درسته :قلب:

امید امرایی
دوشنبه 02 بهمن 1391, 09:00 صبح
مرسی از شما
تابع رو ساده تر هم می شه کرد.



function SAENnum2FAnum_2($str){
$str = str_split($str);
foreach($str as &$letter)
if(is_numeric($letter))
$letter = '&#17' . (28 + 48 + $letter);
return implode('', $str);
}







--------------------------------------
توصیه هایی در دنیای وب و دیجیتال (http://www.amraei.com)

sabloger
دوشنبه 02 بهمن 1391, 09:35 صبح
مرسی از شما
تابع رو ساده تر هم می شه کرد.



function SAENnum2FAnum_2($str){
$str = str_split($str);
foreach($str as &$letter)
if(is_numeric($letter))
$letter = '&#17' . (28 + 48 + $letter);
return implode('', $str);
}







--------------------------------------
توصیه هایی در دنیای وب و دیجیتال (http://www.amraei.com)


ممنون از شما
درسته اما خب اینطوری درک و تجزیه ی اون برای برنامه نویسای مبتدی تر خیلی سخت تر میشه
البته همون کد خودم رو هم میشه کمی کوچک تر کرد، اما خب خواستم با اینکار آموزشی هم داده باشم
بازم ممنون

sabloger
دوشنبه 02 بهمن 1391, 09:35 صبح
کارت درسته :قلب:


قربون شما، خوشحالم که به کارتون اومده

rezaonline.net
دوشنبه 02 بهمن 1391, 11:24 صبح
یه بنچ مارک بگیر ببین اگه از str_replace استفاده کنی سریعتر هست یا این روش شما ؟

function en2fa($num=0)
{
$fa = array("۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹",);
$en = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",);
return str_replace($en,$fa,$num);
}

sabloger
دوشنبه 02 بهمن 1391, 18:45 عصر
یه بنچ مارک بگیر ببین اگه از str_replace استفاده کنی سریعتر هست یا این روش شما ؟

function en2fa($num=0)
{
$fa = array("۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹",);
$en = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",);
return str_replace($en,$fa,$num);
}


درسته روش شما هم روش خوبیه
اما مشکل اینجاست که مدل کار و خروجی کمی با کد بنده فرق داره
و اونم این هست که کد من عدد رو از کل متن خارج میکنه و خب این میتونه مورد استفاده این دو کد رو از هم متفاوت کنه!
بازم ممنون از کدتون