Click here to Skip to main content
6,292,811 members and growing! (10,400 online)
Email Password   helpLost your password?
Languages » C / C++ Language » General     Intermediate

Format File Sizes in Human Readable Format

By Victor Boctor

An article on formatting of file sizes in a human readable format.
VC6Win2K, MFC, Dev
Posted:30 Nov 2002
Views:58,613
Bookmarked:18 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
9 votes for this article.
Popularity: 2.45 Rating: 2.57 out of 5
3 votes, 50.0%
1
1 vote, 16.7%
2

3
1 vote, 16.7%
4
1 vote, 16.7%
5

Format Size Test Application

Introduction

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!

Requirements

  • Using B, KB, MB, GB to display the sizes in a logical format.
  • Using commas as thousands separator

An example would be: 1,023 KB (if size = 1023 * 1024 bytes)

Using the code

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;
}

Future Improvements

The following are planned future improvements for the next versions of the article:

  • Make the thousands separator and the decimal point dependent on Control Panel settings.
  • Unicode Support

History

01-DEC-2002First version

Edit History

2 Dec 2002 - Initial Edit

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Victor Boctor


Member
Victor Boctor is a Windows/Linux professional developer. He has worked in the fields of Email Servers, Automatic Test Equipment, Telecommunications, and Embroidery software. He developed software using C#, C++, MFC, Win32, PHP, Cold Fusion, HTML, XHTML, and SQL.
Occupation: Web Developer
Location: United States United States

Other popular C / C++ Language articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 16 of 16 (Total in Forum: 16) (Refresh)FirstPrevNext
GeneralEmbroidery Pinmembermmhafez7:54 17 Sep '03  
GeneralAlso see GetNumberFormat() PinmemberRavi Bhavnani7:35 1 Dec '02  
GeneralAnother way Pinmemberdabs3:16 1 Dec '02  
GeneralRe: Another way PinmemberVictor Boctor3:31 1 Dec '02  
GeneralRe: Another way PinmemberAndreas Saurwein1:24 4 Dec '02  
GeneralNice, but... PinmemberAnders Molin2:02 1 Dec '02  
GeneralRe: Nice, but... PinmemberVictor Boctor2:11 1 Dec '02  
GeneralRe: Nice, but... PinmemberPaolo Messina12:55 1 Dec '02  
GeneralRe: Nice, but... PinmemberVictor Boctor16:25 1 Dec '02  
GeneralRe: Nice, but... PinmemberDalle22:34 1 Dec '02  
GeneralRe: Nice, but... PinmemberPaolo Messina7:23 2 Dec '02  
GeneralRe: Nice, but... PinmemberVictor Boctor10:20 2 Dec '02  
GeneralToo many numbers? PinmemberDalle2:01 1 Dec '02  
GeneralRe: Too many numbers? PinmemberVictor Boctor3:18 1 Dec '02  
GeneralRe: Too many numbers? PinmemberKarstenK5:17 2 Dec '02  
GeneralRe: Too many numbers? PinmemberCompMan4413:35 2 Sep '08  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin 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
Web13 | Advertise on the Code Project