# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ >  جدا کردن 3 رقم 3 رقم اعداد جهت نمایش مقادیر پولی

## iranrose63

چه طوری می تونم وقتی اعداد رو تو یه textbox وارد می کنم سه رقم سه رقم اونها رو از هم جدا کنم

----------


## hrshojaei

سلام ، امیدوارم این بتونه کمکت کنه 
در رویداد KeyPress تکست باکس بنویس 

if (char.IsLetter(e.KeyChar))
e.Handled = true;
 بعد در رویداد TextChanged بنویس 

Int64 N;
try
{
String S;
S = NumericT.Text.Replace(",", "");
N = Convert.ToInt64(S);
NumericT.Text = N.ToString("#,#");
NumericT.Select(NumericT.Text.Length, 1);
}
catch
{
}
finally
{
this.Invalidate();
}

که NumericT اسم تکست باکسه شماست .
البته یه خورده ایراد داره ولی یکم باهاش ور بری کامل تر میشه . می تونی یک کلاس برای این نوع تکست باکس بسازی که بتونی به ToolBox اضافش کنی .
راستی ببخشید کد یه خورده قاطیه . نمی دونم کد رو چطور باید Paste کرد .

----------


## Alireza_Salehi

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            NumberFormatInfo nfi = new NumberFormatInfo();
            nfi.NumberDecimalDigits = 0;
            textBox1.Text = Decimal.Parse(textBox1.Text, NumberStyles.AllowThousands).ToString("N", nfi);          
            textBox1.Select(textBox1.Text.Length, 0);
        }


با توجه به مقدار و اندازه عددی که وارد میشه نوع متغییر تعریف شده را تغییر بده (هر چه عدد بزرگتر متغییر بزرگتر)!

----------


## iranrose63

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

----------


## Alireza_Salehi

منظورم این بود که محدوده عددی که وارد میشه آنقدر زیاد نشه که خطای سرریز بده (بزرگترین نوع داده را انتخاب کنید- در قسمت Parse )

برای انواع مختلف اعداد قسمت FormatString (پارامتر "N") و NumberStyle رو در حالت های مختلف چک کنید.

اعشاریش رو هم تست نکردم تا حالا، یه کم با این فرمت هاش ور برید درست میشه(لینک های زیر رو ببینید)!
Standard Numeric Format Strings 
NumberStyles Enumeration

----------


## cactuskhan

> private void textBox1_TextChanged(object sender, EventArgs e)
>         {
>             NumberFormatInfo nfi = new NumberFormatInfo();
>             nfi.NumberDecimalDigits = 0;
>             textBox1.Text = Decimal.Parse(textBox1.Text, NumberStyles.AllowThousands).ToString("N", nfi);          
>             textBox1.Select(textBox1.Text.Length, 0);
>         }
> 
> 
> با توجه به مقدار و اندازه عددی که وارد میشه نوع متغییر تعریف شده را تغییر بده (هر چه عدد بزرگتر متغییر بزرگتر)!


'System.Web.UI.WebControls.TextBox' does not contain a definition for 'Select'

----------


## Alireza_Salehi

> 'System.Web.UI.WebControls.TextBox' does not contain a definition for 'Select'


این کد مال ویندوز نه وب ، اونجا باید از جاوا اسکریپت استفاده کنی!

----------


## lomir

از این استفاده کن ولی باید کمی کدو  ست بکنی با چیزی که می خواهی 
(string.Format("{0:0,0}", 876567876

----------


## mahtab_18

سلام

من دستوری نوشتم که با استفاده از اون فرمت text را تغییر می ده .
منظورم اینه که یک text box روی فرم گذاشتم در حالت اجرا وقتی داخل textbox چیزی می نویسم خودش 3 تا 3 تا علامت (،) قرار می دهد . ولی وقتی دکمه  backspace  را هم می زنیم باز هم به حساب عدد فرض می کند و بسته به اون شماره می اندازد و اینجاست که ترتیب به هم می خوره . می خواهم کاری کنم که دکمه  backspace را به حساب نیاره . ممنون می شم کمکم کنید.

----------


## iranrose63

نمی دونم شما برای جدا کردن سه رقم سه رقم اعداد چیکار کردی ولی من این مشکل رو داشتم و تو سایت مطرح کردم یکی از دوستان بهم جواب داد جوابشم این بود

;() NumberFormatInfo nfi = new NumberFormatInfo
;nfi.NumberDecimalDigits = 0
 textBox1.Text = Int64.Parse(textBox1.Text, NumberStyles.AllowThousands).ToString
;(N",nfi")
;(textBox1.Select(textBox1.Text.Length, 0

البته اول باید System.Globalization رو به برنامت اضافه کنی

----------


## mahtab_18

ممنون از جوابتون خیلی کمکم کرد ولی من هنوز مشکل دارم:

1. من می خواهم در حین نوشتن تغییرات ایجاد بشه ولی این کاری که شما گفتید بعد از نوشتن کل اعداد و زدن یک کلید ایجاد می شود.
2. در کدام رویداد باید این تکه برنامه را بنویسم.

----------


## mahtab_18

سلام

جوابتون عالی بود من ابتدا اشتباهاً در رویداد click برنامه را نوشتم ولی بعد با جابجایی قطعه برنامه در رویداد text-change به جواب رسیدم.

فقط یه سوال و اون اینکه منظور از "N" چیست؟

----------


## iranrose63

"N" یعنی اینکه به فرمت عددی تبدیل بشه میتونی برای اینکه اطلاعاتی در این رابطه به دست بیاری تو Help خود vs جستجو کنی دنبال NumberFormatInfo Class باش
یه سرچ تو سایت بکن تو اون تایپک که من جواب گرفتم یه چند تا لینک بود که میتونی ازش استفاده کنی

----------


## sabaab1359

سلام.
من می خواستم از این کدی که گذاشتید استفاده کنم ولی روی سطر
()textBox1.Text = Decimal.Parse(textBox1.Text, NumberStyles.AllowThousands).ToString
خطای 
Input string was not in a correct format. می گیره. چکار کنم؟

----------


## iranrose63

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

----------


## sabaab1359

فرمت تبدیل را مشخص کردم. دقیقا همانطور که iranrose63  نوشته (N",nfi") ولی اینجا ننوشتم. در ضمن خطا را موقع debug کردن می گیره .

----------


## rezaiy.ali

با سلام
من یه تکس باکس دارم که مبلغ پرداختی رو کاربر درون او وارد می کنه
من می خوام زمانی که کاربر در حال وارد کردن مقدار است به صورت اتومات هر سه رقمی که کاربر وارد کد یه ، قرار بده.
چطور میشه این کار را انجام داد
توجه(زمانی که کاربر Back Space زد باید ، ها جا به جا شوند)
*12،411،254*
*بعد از زدن Back Space*
*1،241،125*

----------


## babak23

در رویداد مربوط به text change مربوط به تکست باکس این کد را بنویس

 
private void textBox1_TextChanged(object sender, EventArgs e)
{
decimal Number;
if (decimal.TryParse(textBox1.Text, out Number))
{
textBox1.Text = string.Format("{0:N0}", Number);
textBox1.SelectionStart = textBox1.Text.Length;
}
}


در صورت جستجو به این موارد بر میخوردی

https://barnamenevis.org/showth...A7%DA%A9%D8%B3

https://barnamenevis.org/showth...A7%DA%A9%D8%B3

https://barnamenevis.org/showth...A7%DA%A9%D8%B3

https://barnamenevis.org/showthread.php?t=75685

----------


## vahid662

سلام 
چطوری می تونیم اعدادی رو که در text box وارد می کنیم سه رقم  سه رقم جدا کنیم؟

----------


## hassan razavi

https://barnamenevis.org/search...earchid=730809

----------


## silentrise

سلام
از متد Substring  در کلاس 
string می توتنی استفاده کنی.

Substring(x, y)

x= نقطه شروع
y=نقطه پایان
راستی ورودی باید 
string باشه.
باسپاس.

----------


## Masoud_TB

اگر منظورت در نحوه نمایش است کافیه که بهش FormatString بدی. البته می تونی یک کلاس جدید ایجاد کنی که از TextBox به ارث بره و سپس توی اون این رفتار رو اضافه کنی:

txtNumber.Text = string.Format("{0:n}",2500000);



اینم مثالی برای همین موضوع

----------


## vahid662

> اگر منظورت در نحوه نمایش است کافیه که بهش FormatString بدی. البته می تونی یک کلاس جدید ایجاد کنی که از TextBox به ارث بره و سپس توی اون این رفتار رو اضافه کنی:
> 
> txtNumber.Text = string.Format("{0:n}",2500000);
> 
> اینم مثالی برای همین موضوع


مرسی کارم درست شد اما حالا چطوری می تونیم اون رو به حالت اولیه در بیاوریم چون عددی که در این textBox وارد می شه باید در دیتا بیس ذخیره شود.

----------


## Masoud_TB

توی اون مثالی که برات گذاشتم یک Property به نام Value وجود داره که مقدار رو بر می گردونه می تونی از اون استفاده کنی.

----------


## vahid662

بازم مرسی 
حالا کسی می دونه تو  DataGridView چطوری باید سه رقم سه رقم عدد ها رو جدا کنیم

----------


## boof1363

با سلام میخواستم بدونم چطور میشه تو یه textbox کاربر یه مقدار پولی وارد کنه و سیستم خودش سه رقم سه رقم این اعداد رو از هم جدا کنه که کاربر اشتباه این مقادیر رو وارد نکنه

----------


## silentrise

سلام
این نیز در این سایت مطرح شده بود !
همین سه رقم سه رقم رو سرچ کن !

----------


## boof1363

سلام
پیداش نکردم میشه بیشتر توضیح بدین

----------


## razavi_university

من برای یک برنامه نیاز به TextBoxی برای کار کردن با مقادیر پول دارم
یعنی بعد از وارد شده عدد درون آن، سه تا سه تا جدا کرده و ریال را به انتهای آن اضافه کند.
تا اینجاشو مشکلی ندارم (غیر از اینکه ریال رو سمت راست عدد می‌گذاره و سمت چپش نمی گذاره)

مشکل من در برگردوندن مقدار داخل TextBox برای ذخیره کردن داخل دیتابیس است.
(اول روش حلقه و کار با رشته برای اضافه کردن و حذف علامات و ریال به ذهنم رسید جواب میده ولی خوشم نیومد جالب نیست )
از چه روشی می‌تونم برای برگردوندن عدد درون TextBox استفاده کنم.
 این هم کدی که استفاده می‌کنم:

 private void txtBxPrice_Leave(object sender, EventArgs e)
        {
            TextBox txtBxTest = sender as TextBox;

            if (((txtBxTest.Text.IndexOf("ریال") == -1) & (txtBxTest.Text.IndexOf(',') == -1) & (txtBxTest.Text != "")))
            {
                NumberFormatInfo nfi = new NumberFormatInfo();
                nfi.CurrencyDecimalDigits = 0;
                nfi.CurrencyGroupSeparator = ",";
                nfi.CurrencySymbol = "ریال";
                txtBxTest.Text = Int64.Parse(txtBxTest.Text, NumberStyles.AllowThousands|NumberStyles.AllowCurr  encySymbol).ToString("C", nfi);
             }
        }

----------


## hdv212

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

----------


## razavi_university

درسته من توی برداشتن علامت ','  و "ریال" مشکل دارم.
هیچ راه دیگه‌ای نداره که نخوام از کد زیر استفاده کنم. :افسرده: 

this.textBox1.Text.Replace(" ریال", string.Empty);
نمیشه یه جورایی با این کد درستش کرد

Int64.Parse(txtBxTest.Text, NumberStyles.AllowThousands|NumberStyles.AllowCurr  encySymbol)
من هرچی تلاش کردم نشد  :ناراحت: 
و یا حداقل یه روش دیگه برای اضافه و حذف کردن علامت "ریال" و "," البته به جز حلقه و کار با String
ممنون

----------


## hdv212

دقیقا هدفت از این کار چیه و چرا نمیخوای از اون کد استفاده کنی ؟



> البته به جز حلقه و کار با String


تا اونجایی که ممکنه از کار کردن با String اونم در حلقه، دوری کن، چون این کار سربار زیادی روی حافظه داره.

----------


## razavi_university

من مقادیر رو با پارامتر به SQL Command اضافه می کنم و بعد . . .
اول می‌خواستم متد get Text کنترل TextBox رو Override کنم ولی نشد

نمی‌خوام موقعی که می‌خوام مقادیر رو به پارامتر ها اضافه کنم کد نویسی زیادی انجام بشه

cmd.Parameters.AddWithValue("@mprice", txtBxPrice.Text);





> تا اونجایی که ممکنه از کار کردن با String اونم در حلقه، دوری کن، چون این کار سربار زیادی روی حافظه داره.


نه من حلقه رو برای سه تا سه تا کردن اعداد استفاده می‌کردم و بعد از خروج از حلقه "ریال"  رو Insert می‌کردم برای حذفش هم از همون روشی که خودتون استفاده کردین استفاده کردم.
البته میشه قبل از اینکه تغییرات روی مقادیر داخل TextBox اعمال بشه اون رو داخل یک متغیر دیگه ذخیره کرد و بعد اون متغیر رو داخل دیتا‌بیس ذخیره کرد.( ولی این هم میشه کار اضافه) :ناراحت: 
تا اینکه اون روشی که در پست اول هست رو استفاده کردم  راحت قرار میده ولی برداشتنش ؟؟؟

----------


## hdv212

باز اگه منظورت رو متوجه شده باشم، میخوای ریال رو حذف کنی و به آبجکت SqlCommand ات پاس کنی، اونم با حداقل کد نویسی، خب این چطوره :
cmd.Parameters.AddWithValue("@mprice", this.textBox1.Text.Replace(" ریال", string.Empty));

----------


## razavi_university

خب با "," ها چه کنم که بین هر سه رقم اضافه شده؟؟

----------


## egoldashraf

public override string Text
        {
            get
            {
                return base.Text.Trim().Replace(",", "");
            }
            set
            {
                base.Text = value;
            }
        }

----------


## choobin84

> خب با "," ها چه کنم که بین هر سه رقم اضافه شده؟؟


اصلا چه لزومی داره که کلمه "ریال" داخل خود تکست باکس بیاد.
مهم علامت کاماست که خیلی راحت میشه ورش داشت.
"ریال" رو داخل یک لیبل بگذارید.

----------


## razavi_university

خب چه لزومی داره ما به جای حل مسئله صورت مسئله رو تغییر بدیم :متفکر: 
همانطوری که میدونین در نرم‌افزار‌های تحت ویندوز(مثلا مجموعه Office) مقادیر Currency که با اسامی مختلف (Money)  نامیده می‌شوند. واحد پول مکانی که برای ویندوز مشخص شده است (در regional and language option) را به انتهای عدد اضافه می کنند.(داخل خود TextBox)

----------


## hdv212

خب علامت "," هم از همون طریق میتونی حذفش کنی، کدش رو هم egoldashraf در پست 8 برات نوشته.

----------


## razavi_university

راهی نداره که بشه از این کد استفاده کرد

Int64.Parse(txtBxTest.Text, NumberStyles.AllowThousands|NumberStyles.AllowCurr  encySymbol);

----------


## razavi_university

آخر نتونستم از همون کد بالایی استفاده کنم
ولی برای کم کردن کد نویسی در برنامه ام یک TextBox سفارشی نوشتم که اون کارهایی که می‌خوام رو انجام میده
1- اضافه کردن "ریال" و "," به اعداد
2- دادن خروجی عددی در یک متغیر جداگانه
2- selectAll شدن در هنگام فوکوس گرفتن
3- گرفتن فقط اعداد(0 1 2 3 ... 8 9) و کلید‌های کنترلی

اگه جاییش مشکل داره و یا امکانات دیگه‌ای لازم داده تغییر داده/ بهش اضافه کنید و مجددا آپ نمایید.
ممنون

----------


## rezaiy.ali

با سلام
لطفا فایل را چک کنید
من نتونستم فایل را باز کنم به گیر می خوردم
متشکرم

----------


## razavi_university

چک شد مشکلی نداشت (مشکلتون در دانلود برنامه است یا باز کردن اون در روی کامپیوترتون)
مجددا اون رو به صورت zip هم آپلود می‌کنم تا اگه با rar مشکلی دارید حل بشه

----------


## ezamnejad

با سلام و کسب اجازه از آقای razavi_university تغییراتی در این کنترل ایجاد کردم که باعث کمتر شدن و ساده تر شدن کدها شده . همچنین مقدار بازگشتی خاصیت Value به decimal تغییر کرده که کاربر حتی با خالی بودن TextBox مقدار صفر را دریافت میکنه . خاصیت جدیدی از نوع string به نام ValueWithSeperator هم اضافه شده که مقدار وارد شده در کنترل را سه تا سه تا جدا میکنه .
  خاصیت RightToLeft کنترل هم بدون دلیل override شده بود که حذف شد . اما اگر این کنترل صرفا برای این طراحی شده که اطلاعات را راست به چپ نمایش بده میشه این خاص را به این شکل بازنویسی کرد تا امکان تغییرش توسط کاربر وجود نداشته باشد .

        public override RightToLeft RightToLeft
        {
            get
            {
                return base.RightToLeft;
            }
            set
            {
                base.RightToLeft = RightToLeft.Yes;
            }
        }
نتونستم آیکونش را به صورت دلخواه تغییر بدهم ولی الان آیکونش مثل آیکون TextBox شده .

----------


## razavi_university

خواهش می‌کنم این تاپیک برای همین‌کاره
دوست عزیز نسخه بعدی این کنترل رو چند روز پیش در قسمت نمونه برنامه‌ها گذاشتم که تقریبا یکم کدنویسیش کمتر شده و بهینه‌تر که البته  نسخه جدید رو فقط در قسمت نمونه برنامه‌ها گذاشتم واینجا نگذاشتم(چون این تاپیک یکم قدیمی شده بود برای اینکه تاپیک رو بدون دلیل بالا نیارم ودو بار ضمیمه نکنم)
حالت 3تا 3تا جدا شدن با Override کردن خاصیت Text انجام شده. این کنترل برای کار با مقادیر پولی فارسی است، بنابراین فکر می‌کنم اعداد داخل ان باید به شکل فارسی نمایش داده شوند. به همین علت کنترل باید Right to left باشد. 
در مورد نوع بازگشتی Value بهتره String باشه تا کاربر در مواقع نیاز به نوع مورد نظر خودش تبدیل کنه، (چون من در برنامه ام مقدار Value رو به پارامتر‌های SqlCommand می‌فرستم نیازی به تغییر نوعش نبود)
نسخه‌جدیدتر در قسمت نمونه‌برنامه‌ها

----------


## sahmah65

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

----------


## razavi_university

> دوست عزیز اینکه با تکست باکس معمولی فرقی نداره نتیجه اجرا رو سیستم من :


مطمئنی ؟؟؟  :متعجب:   :متعجب:   :متعجب:

----------


## jeus

samah65 کدام فایل را شما دانلود کردید مال آقای رضوی را یا از آقای ezamnejad را ؟

----------


## sahmah65

> samah65 کدام فایل را شما دانلود کردید مال آقای رضوی را یا از آقای ezamnejad را ؟


مال آقای رضوی رو و برای خودمن هم عجیب بود که چرا اینطوری شد.

----------


## Hosein.Zarei

سلام دوستان درباره Money TextBox باید بگویم که اگر مشکلات آن رفع بشده در بسیاری از برنامه کاربرد خواهد داشت. 1-چسبدیدن و نزیکی زیاد *ریال* به اعداد می باشد. 2-در صورتی که CurrencySymbol خالی باشد خطا می دهد. 3-با اعشار مشکل دارد و آن را حذف می کند. ممنون می شوم که خطاهای آن را رفع کنید و به من اطلاع دهید.

----------


## razavi_university

دوست عزیز من هم  واسه همین سورسشو رو گذاشتم که شما بتونین خودتون تغییرات لازم واسه کارتون رو بهش بدین ولی تا حد امکان سعی کردم امکاناتش عمومیت داشته باشه
در مورد خطاهایی که فرمودین:
1- فکر نمی کنم بیشتر از یک فاصله جالب باشه (از نظر من جالب نبود تفاوت در سلیقه همینه دیگه)
2- خوب آخه واسه من پیش نیومد که بخوام CurrencySymbol رو خالی بگذارم همیشه یه چیزی می گذاشتم (ریال، کیلو و ...)
3- واسه کار من نیازی به اعشار نداشت واسه همین عمدا حذفش کردم

نتیجه گیری آخر : من چون نمی دونم شما چه استفاده ای ازش می خوایید بکنید بهتره خودتون بر حسب نیازتون  تغییرش بدین و نسخه نهایی رو هم همینجا قرار بدین تا سایر دوستان هم استفاده کنند

----------


## Hosein.Zarei

من برای گرم و کمتر نیاز به اعشار دارم بنابراین هرچه خواستم کد آن را عوض کنم نتوانستم نیاز به اعشار را اضافه کنم.
در مورد فاصله هم باید بگویم که اینگونه نشان می دهد:
456,544,100ریال
اگر می شد که قابلیت گذاشتن فاصله به آن اضافه کرد مناسب تر هست:
456,544,100 ریال
من برای این مشکل هرچه سعی کردم ولی حل نشد.
این یکی مشکل زیاد حاد نیست ولی من می خواستم که فقط اعداد را در text نمایش بدهم و ریال را در caption. این مشکل نیز نتوانستم رفع کنم.
بنابراین مشکل را حل کنید یا طریق رفع مشکل را به من راهنمایی کنید.
با تشکر از زحماتتان

----------


## Hosein.Zarei

لطفا راهنمایی کنید!!!

----------


## razavi_university

البته من کد پیچیده ای واسه اون کنترل به کار نبردم . برای هر قسمتش کامنت گذاشتم تا واسه بقیه راهنما باشه
به هر حال سعی می کنم تغییراتی که لازم دارید رو در اون انجام بدم و نسخه جدیدش رو همینجا قرار می دم

_این پست با نسخه جدید کنترل جایگزین می شود_

----------


## Hosein.Zarei

برای اضافه کردن اعشار فقط به جای value = d.ToString("#,#"); این را بنویسید:
value = d.ToString("#,#.#");

----------


## maryam_f

میشه بگین این کار برای Web application چه جوری انجام میشه؟ ممنون میشم.

----------


## maryam_f

كسي نمي دونه تو Web application چه جوري مي شه اينكار رو كرد؟؟؟ خواهشا يكي جواب بده. تاپيك جديد كه نمي ذارن بنويسم!!!

----------


## egoldashraf

https://barnamenevis.org/showthread.php?t=74363

----------


## ali_fast

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

----------


## hana2064

با سلام 
من دو بار برنامه رو د انلود کردم ولی نتونستم استفاده کردم ممنون اگه بگین چه جوری باید استفاده کنیم 
من به برنامه یه فرم اضافه کردم و این کنترل رو از toolboxبهش اضافه کردم ولی error میده .  نمی دونم روش کارش چیه ؟؟ م منون 
argument exception was unhandled
کد
Assembly 'C:\Documents and Settings\salam\Desktop\28sh\New Folder\Money TextBoxhh\Money TextBox\obj\Release\Money TextBox.dll' doesn't contain any UserControl types.

----------


## manibaharlou

سلام من اين كد رو استفاده كردم و جواب داد ولي اين سه رقم شدن فقط در textbox اتفاق ميافته و در ديتاگريد ويو  دوباره به شكل اول برميگرده بايد چكار كرد؟

----------


## razavi_university

خوب این کنترل فقط 3تایی نمایش میده برای اینکه DataGrid درست نمایش بده باید حالت نمایش اون Column از DataGrid رو تغییر بدین 
_جستجو کنین قبلا بحث شده_

----------


## hana2064

لطفا یکی بگه چه جوری باید ازش استفاده کرد من خیلی بهش احتیاج دارم تویه فرم اونو میارم ولی error میده . 
یکی جوااااااااااب بده لطفا

----------


## razavi_university

dll تست شد و مشکلی نداشت
از کدوم نسخه اش استفاده میکنید بهتره اونی که در تاپیک نمونه برنامه ها است رو استفاده بکنین

----------


## kh1387

> سلام
> 
> جوابتون عالی بود من ابتدا اشتباهاً در رویداد click برنامه را نوشتم ولی بعد با جابجایی قطعه برنامه در رویداد text-change به جواب رسیدم.
> 
> فقط یه سوال و اون اینکه منظور از "N" چیست؟


 
میشه بگید چطوری در رویداد  text-change به جواب رسیدید؟
آخه چطوری؟ :متفکر:

----------


## rostamkhani

سلام
این تاپیک که لینک هست بعد از این تاپیک زده شده ولی چون بحث اتوماتیک این موضوع اونجا مطرح شده بود بنده کد رو توی اون تاپیک گزاشتم کداول یه مشکل کوچیکی داره ولی کد دوم مشکل حل شده
https://barnamenevis.org/showth...244#post604244

----------


## hana2064

من ازفایلی که تو نمونه برنامه ها قرار د ادید استفاده می کنم ولی همون error رو می ده 
لطفا فقط بگید که   چه جوری باید ازش استفاده کنم 

Assembly 'C:\Documents and Settings\salam\Desktop\7mehr\Money TextBox\Money TextBox\obj\Release\Money TextBox.dll' doesn't contain any UserControl types.

----------


## razavi_university

از DLLی که در فولدر زیر است استفاده کنید.
Money TextBox\bin\Release\Money TextBox.dll

----------


## jaza_sa

https://barnamenevis.org/showthread.php?t=124791

----------


## hana2064

با سلام علاوه بر textboxی که سه رقم سه رقم اعدادو جداو میکنه آیا می شه که برای وارد کردن عدد 120000 ما فقط عدد 120رو وارد کنیم وسه تا صفر رو خودش اضافه کنه یعنی عدد  رو با فرمت هزارریال وارد کنه. البته با تعریف فیلد قیمت به شکل decimal(18,3)  سه تا صفر تو بانک ا ضافه میشه ولی تو textbox وارد نمیشه  امیدوارم منظورمو درست گفته باشم

----------


## razavi_university

بله این امکان را به راحتی با تغییر سورس می توان قرار داد
3صفری که فرمودین بعد از ممیز اضافه می شوند و ارزش عددی ندارند

----------


## sasanazizi

این هم یک نمونه اش

----------


## nathan

اين كدروامتحان كنيد:

int s = 1237;
Console.WriteLine(s.ToString("0,0"));
//1,237

----------


## nathan

يابه اين صورت:

int s = 1237;
Console.WriteLine(s.ToString("#,#"));
//1,237

----------


## nathan

البته هردوي اينها يك مثال عام هستند!دوستان گرامي كافي است به هرنوع داده عددي كه نيازدارند اين حالت راتعميم دهند.

----------


## razavi_university

> این هم یک نمونه اش





> اين كدروامتحان كنيد:
> 
> int s = 1237;
> Console.WriteLine(s.ToString("0,0"));
> //1,237





> يابه اين صورت:
> 
> int s = 1237;
> Console.WriteLine(s.ToString("#,#"));
> //1,237





> البته هردوي اينها يك مثال عام هستند!دوستان گرامي كافي است به هرنوع داده عددي كه نيازدارند اين حالت راتعميم دهند.


با تشکر از تمامی دوستان
اگر دقت کنید روشهایی که فرمودین یا ضمیمه کردین در نسخه های اولیه MoneyTextBox استفاده شده.
مثلا استفاده از حالت

ToString("C");
یا

ToString("#,#")
به دلایل مشکلاتی که این روشها داشتند کنار گذاشته شدند به عنوان مثال استفاده از C برای چاپ *ریال* باعث قرار دادن آن سمت چپ می شود و یا استفاده از "#,#" به دلیل ایجاد مشکل برای حالت ممیز
روشهایی که اکثرا در MSDN یا سایتهای غیر فارسی زبان دیگر گفته می شود برای زبان و اعداد انگلیسی به خوبی کار می کند (چون اعداد و حروف از چپ نوشته می شوند) ولی برای زبانهایی مانند فارسی که مشکل راست به چپ کماکان در ویندوز نسبتا وجود دارد این روشها کارساز نیست (و یا می خواهیم *ریال* در سمت راست اضافه شود)

 برای توسعه سریعتر و بهتر برای رسیدن به یک کنترل مناسب جهت استفاده در برنامه ها لطفا آخرین مثال را توسعه دهید

----------


## taha mahdi

با سلام خدمت دوستان و تشکر 

بچه ها ببینید کاری که کرده ام درسته من اول به پروژخ اصلی یک کلاس اضافه می کنم بعد با کپی کردن کلاس این تکس باکس و تغیر فضای نام و این کارها بعد کامپوننتی که در toolbox قرار گرفته را روی فرم می کشم و از آن استفاده می کنم 

اما مشکل 
حالا که می خواهم اطلاعات را به drideview وارد کنم برنامه قفل می شه اما در database اطلاعاتم ذخیره شده 

چه کارکنم که این مشکل به وجود نیاد

----------


## h.jaza

> ... قفل می شه ...


یعنی چی قفل میشه؟؟؟

دیباگ کنید ببینید مشکل از کجاس...

----------


## linux

> با تشکر از تمامی دوستان
> اگر دقت کنید روشهایی که فرمودین یا ضمیمه کردین در نسخه های اولیه MoneyTextBox استفاده شده.
> مثلا استفاده از حالت
> 
> ToString("C");
> یا
> 
> ToString("#,#")
> به دلایل مشکلاتی که این روشها داشتند کنار گذاشته شدند به عنوان مثال استفاده از C برای چاپ *ریال* باعث قرار دادن آن سمت چپ می شود و یا استفاده از "#,#" به دلیل ایجاد مشکل برای حالت ممیز
> ...


روشهایی دیگران گفتند استفاده از C و ... درست هست ، شما با تغییر در numberformatinfo همه اینها را می توانید کنترل کنید.

----------


## taha mahdi

> یعنی چی قفل میشه؟؟؟


مطنئن هستم که برنامه هیچ مشکل خاصی نداره
تنها زمانی که از این کلاس استفاده می کنم و برنامه را اجرا می کنم فرم ثابت می ماند و با یک کلیک به حالت not responding می رود ولی تغییرات در پایگاه اعمال می شود

----------


## Masoome_das

سلام



> برای توسعه سریعتر و بهتر برای رسیدن به یک کنترل مناسب جهت استفاده در برنامه ها لطفا آخرین مثال را توسعه دهید


من می خواستم از این کنترل استفاده کنم و در هنگامی که فوکوس روی آن قرار می گیرد رنگ زمینه Texbox تغییر کنه ولی این اتفاق نمی افته یعنی وقتی من در ایونت Enter می خوام رنگ زمینه را عوض کنه عمل نمی کنه .

----------


## mostafah110

من این تابع را نوشتم:
        //convert a number in to money format.
        public static string numberToMoney(string input)
        {
            input = moneyToNumber(input);
            string outputT = "";
            string output = "";
            int j=0;
            for(int i = input.Length-1;i>=0;i--)
            {
                outputT += input[i];
                if (j % 3 == 2 && j < input.Length - 1)
                {
                    outputT += ",";
                }
                j++;
            }
            for(int i=outputT.Length-1;i>=0;i--)
            {
                output += outputT[i];
            }
            return output;
        }

        //convert a money format to number
        public static string moneyToNumber(string input)
        {
            string output = "";
            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] != ',')
                    output += input[i];
            }
            return output;
        }

----------


## rezakhafan4u

> من این تابع را نوشتم:
>         //convert a number in to money format.
>         public static string numberToMoney(string input)
>         {
>             input = moneyToNumber(input);
>             string outputT = "";
>             string output = "";
>             int j=0;
>             for(int i = input.Length-1;i>=0;i--)
> ...


آقا من با این برنامه شما خیلی حال کردم   :خجالت: 
ازش دوتا سوال دارم
یکی اینکه اون قسمت J%3 == 2  رو برام یک توضیح میدی ؟
دوم اینکه اگه بخوایم با یک فاصله کنار عدد بنویسه "ریال" و تو تابع بعدی  که می خواد اونو به عدد معمولی تبدیل کنه بتونه اونو حذف کنه، کد رو به  نظرت چجوری تغییر بدیم بهتره؟ 

با تشکر

----------


## rezakhafan4u

> اینم بد نیست منتها نتونستم به تابع تبدیلش کنم.ممنون میشم اینم ارتقا به تابع بدید
>   
> if
> 
>  (!(string.IsNullOrEmpty(this.G_JAV_MB.Text)))
> 
>             {
> 
>                 
> ...



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

----------


## parsester

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

textbox1.text.trim(',')

----------


## mmd2009

https://barnamenevis.org/showthread.p...A7%D8%B4%D8%AF

----------


## mostafah110

یه سری تغییرات تو این تابع دادم که میزارمشون!
//convert a number in to money format.
        public static string numberToMoney(string input, bool rightToLeft = true)
        {
            input = moneyToNumber(input);
            double inp_int = Convert.ToDouble(input);
            bool containDot = false;
            if (inp_int < 0)
            {
                input = input.Remove(0, 1);
            }
            string[] s = { "", "" };
            if (input.Contains('.'))
            {
                s = input.Split('.');
                input = s[0];
                containDot = true;
            }
            string outputT = "";
            string output = "";
            int j = 0;
            for (int i = input.Length - 1; i >= 0; i--)
            {
                outputT += input[i];
                if (j % 3 == 2 && j < input.Length - 1)
                {
                    outputT += ",";
                }
                j++;
            }
            for (int i = outputT.Length - 1; i >= 0; i--)
            {
                output += outputT[i];
            }
            if (containDot)
                output += "." + s[1];
            if (inp_int < 0)
            {
                if (rightToLeft)
                    output = output.Insert(output.Length, "-");
                else
                    output = output.Insert(0, "-");
            }
            return output;
        }

        //convert a money format to number
        public static string moneyToNumber(string input)
        {
            if (input == "")
                input = "0";
            string output = "";
            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] != ',')
                    output += input[i];
                if (input[i] == ' ')
                    break;
            }
            return output;
        }

----------


## aminaltavista

سلام

اما یه مشکل اساسی دیگه ای هم داره!

آنتی ویروس من اونو ویروس میشناسه! یا سیستمتون ویروسی هست یا خودتون ویروس نوشتید. شاید نه باید !
اما جسارتم رو ببخشید . بعد از دانلود موقع اجرا حذف شد . احتمالا موقع نصب هم همین بلا سرش میاد.

----------


## sagggad

ازتوابع Mid و Len استفاده کن.(آسون ترین راه!!)

----------


## saman_hm

decimal a = Convert.ToDecimal (x);
            price  = a.ToString("#,##0");
مقدار X عدد شما به صورت String میباشد . به همین سادگی

----------


## sab2020

سلام دوستان 
در اولین پست کدی قرار داده شد ، ولی نمیتونم اجرا کنم 
 if (char.IsLetter(e.KeyChar))
                e.Handled = true;
زیر KeyChar خط کشیده . 
چکار باید کرد ؟

----------


## qartallar

این کد رو درون text changed بنویس واقعا عالی کار میکنه



private void txt1_TextChanged(object sender, EventArgs e)
        {
            decimal Number;
            if (decimal.TryParse(txt1.Text, out Number))
            {
                txt1.Text = string.Format("{0:N0}", Number);
                txt1.SelectionStart = txt1.Text.Length;
            }

        }

----------


## qartallar

دوست عزیز این کد رو باید تو رویداد key press بنویسی

----------


## qartallar

> سلام دوستان 
> در اولین پست کدی قرار داده شد ، ولی نمیتونم اجرا کنم 
>  if (char.IsLetter(e.KeyChar))
>                 e.Handled = true;
> زیر KeyChar خط کشیده . 
> چکار باید کرد ؟


دوست عزیز این کد رو باید تو رویداد key press بنویسی

----------


## mostafah110

> آقا من با این برنامه شما خیلی حال کردم  
> ازش دوتا سوال دارم
> یکی اینکه اون قسمت J%3 == 2  رو برام یک توضیح میدی ؟
> دوم اینکه اگه بخوایم با یک فاصله کنار عدد بنویسه "ریال" و تو تابع بعدی  که می خواد اونو به عدد معمولی تبدیل کنه بتونه اونو حذف کنه، کد رو به  نظرت چجوری تغییر بدیم بهتره؟ 
> 
> با تشکر


اولا خیلی معذرت که اینقدر دیر جواب دادم  :خجالت: 
خب قراره ۳ تا ۳ تا جدا کنیم j%3 هم باقیمانده J بر ۳ رو بهمون میده ... اونجاهایی که باقیمانده صفر هستن پس یک کاما میزاریم.
خب برای حذف ریال هم از دستور replace  استفاده کن. این شکلی:


input.replace(" ریال", "");

----------


## سید جعفر

سلام یه سوال دارم
چطوری میتونم که نوعیت پولی رو زمانی که تو تکس باکس نوشتم و ارقام ذخیره شد تو دتابس نوعیت پولی مشخص بشه مثلا من از چند تا نوعیت پولی استفاده میکنم مثلا دلار ؛ تومان ؛ یورو ؛ و افعانی . حالا میخوام وقتی ارقامم رو وارد کردم وقتی ذخیره میشه داخل دتابس نوعیت پولی هم ذخیره بشه مثلا من وارد میکنم تو حساب دلاری خودم 89000 هشتادو نه هزار دالار این تو دتابس اینجوری بیاد $89,000 علامت دلار هم آخرش بیاد و تو محاسبات هم این علامت محاسبات رو بهم نزنه .
تشکر

----------

