PDA

View Full Version : کار با مقادیر long



mmbguide
یک شنبه 30 مرداد 1401, 12:43 عصر
سلام دوستان

من یک Extension Method دارم که مقادیر long رو با فرمت مورد نظر برمیگردونه. مقادیر Size فایل هستش که میخوام با واحدها مختلف نمایش بدم:

public static string ShowInStringFormat(this long fileSize, bool addUnit = false)
{
//file size less than 999 byte in B
if (fileSize < 1024)
return fileSize.ToString("n0") + (addUnit == true ? " B" : string.Empty);


//file size between 999 and 102400 byte in KB
if (fileSize >= 1024 & fileSize < 102400)
return (fileSize / 1024).ToString("n2") + (addUnit == true ? " KB" : string.Empty);


//file size more than 120400 byte in MB
if (fileSize >= 102400)
{
long a0 = (fileSize / 1048576);
string a1 = (fileSize / 1048576).ToString();
long a2 = long.Parse(a1);
var a3 = a2.ToString("n2");


return (fileSize / 1024 / 1024).ToString("n2") + (addUnit == true ? " MB" : string.Empty);
}


return fileSize.ToString();
}



مشکلات

در هر حالی از فرمت بندی مقدار دو رقم اعشار بعد از عدد صحیح همیشه 0 هستش.
در آخرین بخش از تبدیلات، نتیجه تقسیم هرگز در متغیر ذخیره نمیشه و 0 هستش در صورتی که در خطی که مستقیم return انجام شده مقدار fileSize مقدار داره. در کل متغیر های a همیشه 0 هستد و اصلا مقدار ندارند و دلیلش را هم نمیدونم.


ممنون اگر راهنمایی کنید.

mazoolagh
دوشنبه 31 مرداد 1401, 23:25 عصر
سلام و روز خوش


در هر حالی از فرمت بندی مقدار دو رقم اعشار بعد از عدد صحیح همیشه 0 هستش.
چون fileSize و 1024 هر دو صحیح هستن، نتیجه هم بصورت صحیح برمیگرده.
بجای 1024 بنویسین 1024.0 تا نتیجه بصورت float (در واقع double) برگرده و اعشار داشته باشین:
//file size between 999 and 102400 byte in KB[/VB][VB]
if (fileSize >= 1024 & fileSize < 102400)
return (fileSize / 1024.0).ToString("n2") + (addUnit == true ? " KB" : string.Empty);

mazoolagh
دوشنبه 31 مرداد 1401, 23:41 عصر
در آخرین بخش از تبدیلات، نتیجه تقسیم هرگز در متغیر ذخیره نمیشه و 0 هستش در صورتی که در خطی که مستقیم return انجام شده مقدار fileSize مقدار داره. در کل متغیر های a همیشه 0 هستد و اصلا مقدار ندارند و دلیلش را هم نمیدونم.

همون داستان اینجا هم هست،
و البته مقادیری از fileSize میتونه کمتر از 1048576 باشه و نتیجه کمتر از 1 هست و اینجوری a0 مقدارش صفر میشه.
پس هم مقدار ثابت رو بجای صحیح، اعشاری کنین و هم a2 رو double تعریف کنین.

mmbguide
یک شنبه 20 شهریور 1401, 13:53 عصر
سلام. ممنون مشکلم حل شد.

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

mazoolagh
دوشنبه 21 شهریور 1401, 11:57 صبح
سلام دوباره
اون مقادیر حتما کمتر از 0 بوده، if رو چک کنین!

و البته مقادیری از fileSize میتونه کمتر از 1048576 باشه و نتیجه کمتر از 1 هست و اینجوری a0 مقدارش صفر میشه.