# زبان های اسکریپتی > JavaScript و Framework های مبتنی بر آن > مقاله: تبدیل اعداد انگلیسی به فارسی در JavaScript!

## eAmin

سلام.

این در حقیقت یه utility در js به شمار می یاد،  برای اونهایی می خوان اعداد انگلیسی رو به اعداد پارسی تبدیل کنند.
قبلا یه تاپیک در اینمورد مورد بود، در بخش ASP.NET اینبار در جاوااسکریپت پیاده سازی شده.

توجه: شما مجازید فقط از string ها برای استفاده در کارتون ازش استفاده کنید، چون با این عمل خاصیت عددی اعداد تبدیل شده از بین می رود.

/*
 * English digit to persian
 * Copyright(C) 2009 by Amin Akbari [ http://eAmin.me ]
 * Licensed under the MIT Style License [http://www.opensource.org/licenses/mit-license.php]
 *
 */

String.prototype.toFaDigit = function() {
	return this.replace(/\d+/g, function(digit) {
		var ret = '';
		for (var i = 0, len = digit.length; i < len; i++) {
			ret += String.fromCharCode(digit.charCodeAt(i) + 1728);
		}

		return ret;
	});
};

// Sample:
"012345srh6srh789".toFaDigit(); //  ۰۱۲۳۴۵srh۶srh۷۸۹


و برعکس (برای انجام محاسبات بر روی اعداد):

String.prototype.toEnDigit = function() {
	return this.replace(/[\u06F0-\u06F9]+/g, function(digit) {
		var ret = '';
		for (var i = 0, len = digit.length; i < len; i++) {
			ret += String.fromCharCode(digit.charCodeAt(i) - 1728);
		}

		return ret;
	});
};

parseInt(str.toEnDigit(), 10);


موفق باشید.

----------


## amirepsilon

میشه توضیح بدی این رو چطور باید استفاده کنیم ؟

----------


## eAmin

اگر می خواید تمامی اعداد درون صفحه به اعداد فارسی تبدیل بشن از کد زیر استفاده کنید:
window.onload = function() {
	var body = document.getElementsByTagName("body")[0];
	body.innerHTML = body.innerHTML.toPersian();
};

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

----------


## vahid67

آقا این کدها رو کجای صفحه باید بگزاریم ؟؟؟؟؟ توی head توی body یا ؟؟؟؟؟
من همچین تگی درست کردم و گذاشتم بین این دوتا کار نکرد ....
  <script language="javascript">
    
  </script>

----------


## eAmin

عجیب بود خیلی!
شما این رو بزارید بین تگ head به امید خدا جواب می گیرید:

<script type="text/javascript" charset="utf-8">

window.onload = function() {
	// argument true to arabic(!) num
	alert("012345srh6srh789".toFaDigit(true)); // ٠١٢٣٤٥srh٦srh٧٨٩

	// argument false|none to Persian(farsi) num
	alert("012345srh6srh789".toFaDigit()); //  ۰۱۲۳۴۵srh۶srh۷۸۹
};

</script>

----------


## vahid67

امین جان مرسی ایندفه وقتی صفحه رو باز میکنم دو تا پیغام میاد که باید OK کنم تا بره توی سایت بعدش هم باز هم اعداد انگلیسی هستند.... پیغامش هم اینه 
٠١٢٣٤٥srh٦srh٧٨٩

یه بار هم  بدون این  دستورها گذاشتم هیچ اتفاقی نیافتاد....
window.onload = function() {
	// argument true to arabic(!) num
	alert("012345srh6srh789".toFaDigit(true)); // ٠١٢٣٤٥srh٦srh٧٨٩

	// argument false|none to Persian(farsi) num
	alert("012345srh6srh789".toFaDigit()); //  ۰۱۲۳۴۵srh۶srh۷۸۹
};

----------


## eAmin

این کدها در Notepad ویندوز کپی کنید و با فرمت HTML ذخیره کنید و نتیجه رو مشاهده کنید:

<script type="text/javascript" charset="utf-8">

String.prototype.toFaDigit = function() {
    return this.replace(/\d+/g, function(digit) {
        var ret = '';
        for (var i = 0, len = digit.length; i < len; i++) {
            ret += String.fromCharCode(digit.charCodeAt(i) + 1728);
        }

        return ret;
    });
};

window.onload = function() {
    var body = document.getElementsByTagName("body")[0];
    body.innerHTML = body.innerHTML.toFaDigit();
};

</script>

<body>

<p>329860v3908w09eymc</p>
<p>536349vm83w4tegy</p>

<p>4555585v9364v5</p>

<p>457346b747b7b5444e5y</p>



</body>

----------


## site20042005

با سلام
یه سوال فوری دارم:
اگه بخوام بر عکس این کار را انجام بدم باید چه تغییری تو این کد بدم؟؟؟؟؟
یعنی تو صفحه اعداد فارسی دارم و می خوام به انگلیسی تبدیل بشه.

خیلی اورژانسیه 
ممنونم

----------


## eAmin

جواب در پست اول هست ������

----------


## desiran

> اگر می خواید تمامی اعداد درون صفحه به اعداد فارسی تبدیل بشن از کد زیر استفاده کنید:
> window.onload = function() {
> 	var body = document.getElementsByTagName("body")[0];
> 	body.innerHTML = body.innerHTML.toPersian();
> };
> امتحان کنید و feedback بفرستید.


سلام خسته نباشید من می خواهم از این کد این طوری استفاده کنم که به جای اینکه عداد داخل تگ body رو برام فارسی کنه عداد داخل هر چندتا تگ Span رو برام فارسی کنه و وقتی عبارت body رو تویه کد زیر به جاش span می زارم کار نمی کنه فقط عداد اولین تگ span  صفحه را فارسی می کنه چی کار باید کرد

var body = document.getElementsByTagName("span")[0];

----------


## eAmin

> سلام خسته نباشید من می خواهم از این کد این طوری استفاده کنم که به جای اینکه عداد داخل تگ body رو برام فارسی کنه عداد داخل هر چندتا تگ Span رو برام فارسی کنه و وقتی عبارت body رو تویه کد زیر به جاش span می زارم کار نمی کنه فقط عداد اولین تگ span  صفحه را فارسی می کنه چی کار باید کرد
> 
> var body = document.getElementsByTagName("span")[0];


سلام

خب چیزی عجیبی نیست، همونطور که مشخصه خروجی getElementsByTagName آرایه است، و شما باید برای اینکه تمامی المنتهای پیدا شده رو پیمایش کنید باید از حلقه کمک بگیرید.
var ele = document.getElementsByTagName('span');
for (var i=0; i < ele.length; i++) {
	ele[i].innerHTML = ele[i].innerHTML.toPersian();
}

----------


## nPad.Net

> اگر می خواید تمامی اعداد درون صفحه به اعداد فارسی تبدیل بشن از کد زیر استفاده کنید:
> window.onload = function() {
>     var body = document.getElementsByTagName("body")[0];
>     body.innerHTML = body.innerHTML.toPersian();
> };
> امتحان کنید و feedback بفرستید.


با تشکر از دوستمون eAmin
تابع رو اجرا کردم اگه کل page فقط متن باشه خیلی خوب جواب میده ولی چون تمام اعداد رو فارسی میکنه کل سایزهایی (Width Or Height)که برا کنترل های صفحه انتخاب می کنیم رو از حالت valid خارج میکنه در نتیجه همه کنترل ها با size پیش فرض نشون داده میشن!چطور میتونیم این Bug رو رفع کنیم؟


ممنون از راهنماییتون

----------


## rakhshanmt

سلام من وقتي كد زير رو مي ذارم تمام سايز فونت ها بهم ميريزه و رنگ هاشونم يكي ميشه

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

<script type="text/javascript" charset="utf-8">

String.prototype.toPersian = String.prototype.toFaDigit = function(a) {
	return this.replace(/\d+/g, function(digit) {
		var digitArr = [], pDigitArr = [];
		for (var i = 0, len = digit.length; i < len; i++) {
			digitArr.push(digit.charCodeAt(i));
		}

		for (var j = 0, leng = digitArr.length; j < leng; j++) {
			pDigitArr.push(String.fromCharCode(digitArr[j]+((!!a && a == true) ? 1584 : 1728)));
		}

		return pDigitArr.join('');
	});
};


window.onload = function() {
	var body = document.getElementsByTagName("body")[0];
	body.innerHTML = body.innerHTML.toPersian();
};

</script>

----------


## mohrdmk

سلام.
من هم مشکل nPad.Net و rakhshanmt رو دارم .. کسی میتونه این مشکلات رو رفع کنه ؟؟؟؟؟ خیلی لازمه!!!  :افسرده:

----------


## fumnimda

> با تشکر از دوستمون eAmin
> تابع رو اجرا کردم اگه کل page فقط متن باشه خیلی خوب جواب میده ولی چون تمام اعداد رو فارسی میکنه کل سایزهایی (Width Or Height)که برا کنترل های صفحه انتخاب می کنیم رو از حالت valid خارج میکنه در نتیجه همه کنترل ها با size پیش فرض نشون داده میشن!چطور میتونیم این Bug رو رفع کنیم؟
> 
> 
> ممنون از راهنماییتون


خب این اتفاق طبیعیه. چون از همه چیز در html به صورت متنی دیده می شه. یک راهش اینه که از css و class برای اندازه دادن به کنترل ها و هر چیزی تو صفحه استفاده کنید. البته دقت کنید که css ای که تعریف می کنید رو به صورت درون خطی تعریف نکنید و حتما از کلاس استفاده کنید.

----------


## raha_1362

سلام 
من این کد را استفاده کردم در حالت عادی (وقتی توی صفحه گیرید نباشد) خیلی خوب جواب می ده اما با گیرید اسکین گیرید رو برمی داره و صفحه حالت ساده ای پیدا می کنه 
با این کد چطور می شه اعداد توی گیرید را فارسی کرد؟

----------


## bemamian

درود

با کد زیر میتونید تمام اعداد رو توی صفحه فارسی کنید


 
String.prototype.toPersian = String.prototype.toFaDigit = function (a) {
    return this.replace(/\d+/g, function (digit) {
        var digitArr = [], pDigitArr = [];
        for (var i = 0, len = digit.length; i < len; i++) {
            digitArr.push(digit.charCodeAt(i));
        }
        for (var j = 0, leng = digitArr.length; j < leng; j++) {
            pDigitArr.push(String.fromCharCode(digitArr[j] + ((!!a && a == true) ? 1584 : 1728)));
        }
        return pDigitArr.join('');
    });
};
 
function TraceNodes(Node) {
    if (Node.nodeType == 3)  //TextNode
        Node.nodeValue = Node.nodeValue.toPersian();
    else
        for (var i = 0; i < Node.childNodes.length; i++)
            TraceNodes(Node.childNodes[i]);
}
TraceNodes(document);

----------


## Morteza.B

سلام
من از اين كد استفاده كردم ولي يه مشكلي هست...اونم اينه كه جدولام رو خرا ميكنه..
ميشه كمك كنيد؟؟؟؟

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

----------


## miyandari

> اگر می خواید تمامی اعداد درون صفحه به اعداد فارسی تبدیل بشن از کد زیر استفاده کنید:
> window.onload = function() {
>     var body = document.getElementsByTagName("body")[0];
>     body.innerHTML = body.innerHTML.toPersian();
> };
> امتحان کنید و feedback بفرستید.



با سلام 
یه سئوال داشتم اگه بخوام فقط عدد های بین تگها (نه داخل تگها) یعنی بین علامتهای > < به فارسی تبدیل بشن چیکار باید بکنم ؟
چون همونطور که مستحضرید ما داخل تگها value هایی داریم که مقدار آنها در دیتابیس ریخته می شود با تبدیل کد اعداد به مشکل بر میخوریم . ولی اون چیزی که نمایش داده میشه داخل علامات بزرگتر و کوچکتره . 
با تشکر

----------


## id1385

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

شکل خروجی :

Farsi Numbers      = ۱۲۳۴۵۶۷۸۹۰
Splited Numbers1 = 1/234/567/890
Splited Numbers2 = ۱/۲۳۴/۵۶۷/۸۹



فانکشن تبدیل اعداد به فارسی :


function Number2Farsi(Numbers){ // Output = (1234567890 => ۱۲۳۴۵۶۷۸۹۰)
/*
Please Dont Remove No Line : Coded By Ata Amini(id1385) 
SAMPLE 1 = Number2Farsi('1234567890');
SAMPLE 2 = Number2Farsi('Ata Amini: 09123532116');
SAMPLE 3 = var MyNumbers = '1234567890';  Number2Farsi(MyNumbers);
*///Defintion(s)
	var NumbersLen 			= 		Numbers.length; 
	var CurentDigit			= 		''; // store current digit in for lap
	var FinalDigits			= 		''; // store converted digit in for lap
	var	num0				=		"۰";
	var	num1				=		"۱";
	var	num2				=		"۲";
	var	num3				=		"۳";
	var	num4				=		"۴";
	var	num5				=		"۵";
	var	num6				=		"۶";
	var	num7				=		"۷";
	var	num8				=		"۸";
	var	num9				=		"۹";
if (NumbersLen <= 0 ){
	return num0;}//if
		else if (NumbersLen > 0 ){
			for (var i=0 ; i <= NumbersLen-1 ; i++){
				CurentDigit  = Numbers.substring(i,i+1);
				FinalDigits += ConvertNum(CurentDigit);
			}//for
		}//else
function ConvertNum(Num){
	switch (Num) {
	case '0': return num0; break;
	case '1': return num1; break;
	case '2': return num2; break;
	case '3': return num3; break;
	case '4': return num4; break;
	case '5': return num5; break;
	case '6': return num6; break;
	case '7': return num7; break;
	case '8': return num8; break;
	case '9': return num9; break;
	default: return Num; // End
	}//switch
}//ConvertNum	
	return FinalDigits; // Final Return		
}//Number2Farsi



فانکشن جداکردن اعداد:

function SplitDigit(Digit,Splictor){
/*
Please Dont Remove No Line : Coded By Ata Amini(id1385)
Not Allwed In Splictor "\"
SAMPLE	 =	SplitDigit('1200000',',');
SAMPLE	 =	Number2Farsi(SplitDigit('1200000','.'));
*///DEFINTION(S)
	var DigitsLen		=		Digit.length;
	var CurrentDigit	=		'';
	var FinalDigit		=		'';
	var DefaultSplictor	=		'';
	var DigitArray		=		new Array();
	var DigitREV		=		new Array();
	var N = 0;	
// SPLICTOR STATE
	if (Splictor == "") { DefaultSplictor = ','} else { DefaultSplictor = Splictor; }
// SUBSTRING
	for (var i=0 ; i <= DigitsLen-1 ; i++){
				CurrentDigit  = Digit.substring(i,i+1); //SUBSTRING DIGITS
				DigitArray += CurrentDigit; // SETTING IN ARRAY
		}// FOR		
	// REV	
	for (var i=0 ; i <= DigitArray.length -1 ; i++){
		var K = (DigitArray.length - 1) - i ;
		N++;
		if (N == 1 || N == 2 || N == 3){
		DigitREV += DigitArray[K];} else if (
		N >= 3) { 
		N = 1; DigitREV += DefaultSplictor + DigitArray[K]; 
		}
		}// FOR	
// Final		
	for (var i=0 ; i <= DigitREV.length-1 ; i++){
				var L = (DigitREV.length - 1) - i ;
				FinalDigit += DigitREV [L];
		}// FOR			

		return 	FinalDigit;	// Output	
}



در آخر هم براتون اتچ میکنم.


موفق باشین.

----------


## mahsa.n

> شما به محتوای اون دو پیغام توجه کردید؟ آیا فهمیدید چه اتفاقی افتاد؟ اونها فقط یک مثال بودن تا شما متوجه بشید که کد مربوطه مشکل خاصی نداره.
> 
> دوست عزیز، عذر می خوام ولی اینجا یک مکان تخصصی هست، شما باید مطالب پیش پا افتاده رو از طریق کتاب خودندن و جستجو در اینترنت یاد بگیرید، نه اینکه چون اینجا صرفا یک انجمن فارسی هست، بیاید و درخواست کد کنید ( البته کد برای عموم گذاشته شده! به اضافه طرز استفاده از اون. ) و یا ...
> اگر شما کمی JavaScript بلد بودید با یک نگاه می تونستید از این کد استفاده کنید.
> 
> امیدوارم به بنده خرده نگیرید، در هر صورت برای آخرین شمارو راهنمایی می کنم.
> 
> </body>
> [/CODE]


دوستان برای اینکه مشکلاتشون حل بشه به جامعه برنامه نویس مراجعه میکنن، اینجا برای سوال کردن و یاد گرفتنه
خیلی خوبه که وقتی به دیگران آموزش میدیم این کار رو با حوصله و با جزییات انجام بدیم

----------


## mohammad50

سلام آیا امکان این هست که اعداد رو توی صفحه فارسی نشون بده ولی وقتی اعداد رو کاربر کپی میکنه همون انگلیسی باشه.
مثلا در نظر بگیرید من میخوام شناسه تراکنش در صفحه به صورت ٤٠٧٢٢٨١٢ نشون بده ولی وقتی کاربر میخواد این شناسه رو کپی کنه 40722812 باشه.

----------

