![]() |
Languages »
C / C++ Language »
General
Intermediate
Format File Sizes in Human Readable FormatBy Victor BoctorAn article on formatting of file sizes in a human readable format. |
VC6Win2K, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

While working on a project I needed to display the sizes in a human readable format, i.e. 1KB, 1.20MB, and so on. Although I am referring to this functionality here as file size formatting, the same code can be used to format any value that represents a number of bytes. Due to the simplicity of the problem, I decided that this would be a perfect topic for my first article!
An example would be: 1,023 KB (if size = 1023 * 1024 bytes)
The code is composed of two functions. The first is InsertSeparators() which is used internally from within the main function to add the thousands separator. The second and main function is FormatSize() which is used to do the all the
required formatting.
Following is the code for InsertSeparators(). This function is placed in an unnamed namespace in order to make it a local function.
namespace { /** * Converts a positive number to a string while inserting separators. * * @param dwNumber A positive number to add thousands separator for * * @return The number with thousand separators as a CString */ CString InsertSeparator (DWORD dwNumber) { CString str; str.Format("%u", dwNumber); for (int i = str.GetLength()-3; i > 0; i -= 3) { str.Insert(i, ","); } return (str); } }
Following is the code for the FormatSize() function:
/** * Converts a filesize to a human readable format. * * This involves the use of K and M as multipliers. Hence, * strings are formatted as 1024 -> 1KB, 1023 -> 1,023 B, * and so on. * * @param dwFileSize File size to be formatted. * * @return The formatted filesize as a CString */ CString FormatSize (DWORD dwFileSize) { static const DWORD dwKB = 1024; // Kilobyte static const DWORD dwMB = 1024 * dwKB; // Megabyte static const DWORD dwGB = 1024 * dwMB; // Gigabyte DWORD dwNumber, dwRemainder; CString strNumber; if (dwFileSize < dwKB) { strNumber = InsertSeparator(dwFileSize) + " B"; } else { if (dwFileSize < dwMB) { dwNumber = dwFileSize / dwKB; dwRemainder = (dwFileSize * 100 / dwKB) % 100; strNumber.Format("%s.%02d KB", (LPCSTR)InsertSeparator(dwNumber), dwRemainder); } else { if (dwFileSize < dwGB) { dwNumber = dwFileSize / dwMB; dwRemainder = (dwFileSize * 100 / dwMB) % 100; strNumber.Format("%s.%02d MB", InsertSeparator(dwNumber), dwRemainder); } else { if (dwFileSize >= dwGB) { dwNumber = dwFileSize / dwGB; dwRemainder = (dwFileSize * 100 / dwGB) % 100; strNumber.Format("%s.%02d GB", InsertSeparator(dwNumber), dwRemainder); } } } } // Display decimal points only if needed // another alternative to this approach is to check before calling str.Format, and // have separate cases depending on whether dwRemainder == 0 or not. strNumber.Replace(".00", ""); return strNumber; }
The following are planned future improvements for the next versions of the article:
| 01-DEC-2002 | First version |
2 Dec 2002 - Initial Edit
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 30 Nov 2002 Editor: Brian Delahunty |
Copyright 2002 by Victor Boctor Everything else Copyright © CodeProject, 1999-2009 Web10 | Advertise on the Code Project |