65.9K
CodeProject is changing. Read more.
Home

Singular vs. Plural in Item Counts

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.17/5 (4 votes)

Jul 25, 2016

CPOL

1 min read

viewsIcon

13211

downloadIcon

136

A simple way to display "item" or "items" instead of "item(s)"

   

Introduction

To allow for an item-count display to handle a number that may or may not be one, this display usually includes something like item(s), file(s), folder(s), document(s), second(s), minute(s), hour(s), or day(s). In some programs, the parentheses around the "s" are left out. In those cases, there is an apparent assumption that the quantity will rarely be one. It would be better to display an "s" only when needed, without parentheses.

The following solution only works for English text. There are various articles on CodeProject that address this problem for other languages.

Solution

To make it easy to display an "s" only when needed, I wrote the following macro:

#define SINGULAR(n) (n == 1 ? _T("") : _T("s"))

If you only want to display Unicode strings, replace _T("...") with L"...".

To use it, put this macro into an include file that is included by source files that need it. Then, write code such as the following:

CString strMsg;
strMsg.Format (_T("%d item%s"), n, SINGULAR(n));

Then display strMsg. For words such as "index" whose plural form ends in "es", use the following macro:

#define SINGULAR_ES(n) (n == 1 ? _T("") : _T("es"))

For words such as "man" whose plural form does not fit either of these patterns, use an inline conditional:

CString strMsg;
strMsg.Format (_T("%d %s"), n, (n==1 ? _T("man") : _T("men")));

Sample Program

The program Singular demonstrates these three circumstances for selecting between singular and plural forms of words.