Formatting Negative Numbers Differently Than Positive

Environment: .NET

In my last article, I presented formatting specifiers for dates and times. Format specifiers are most often used with numbers. For example, to print a decimal number to three levels of precision, you would use D3 as the specifer. The following uses this specifier within WriteLine:

System.Console.WriteLine("A Number: {0:D3}", dVar);

While numeric specifiers work with both positive and negative numbers, there are times when you want a negative number treated differently than a positive number.

The placeholder for specifying the format of a value can actually be separated into either two or three sections. If the placeholder is separated into two sections, the first is for positive numbers and zero and the second is for negative numbers. If it is broken into three sections, the first is for positive values, the middle is for negative values, and the third is for zero.

The placeholder is broken into these sections using a semicolon. The placeholder number is then included in each. For example, to format a number to print with three levels of precision when positive, five levels when negative, and no levels when zero, you do the following:


Listing 1 presents this example in action along with a couple of additional examples.

Listing 1 — threeway.cs.

 1: // threeway.cs - Controlling the formatting of numbers
 2: //----------------------------------------------------
 4: using System;
 6: class myApp
 7: {
 8:  public static void Main()
 9:  {
10:    Console.WriteLine("\nExample 1...");
11:    for ( int x = -100; x <= 100; x += 100 )
12:    {
13:      Console.WriteLine("{0:000;-00000;'0'}", x);
14:    }
16:    Console.WriteLine("\nExample 2...");
17:    for ( int x = -100; x <= 100; x += 100 )
18:    {
19:      Console.WriteLine("{0:Pos: 0;Neg: -0;Zero}", x);
20:    }
22:    Console.WriteLine("\nExample 3...");
23:    for ( int x = -100; x <= 100; x += 100 )
24:    {
25:      Console.WriteLine("{0:You Win!;You Lose!;You Broke
                               Even!}", x);
26:    }
27:  }
28: }

This listing produces the following output:

Example 1...

Example 2...
Neg: -100
Pos: 100

Example 3...
You Lose!
You Broke Even!
You Win!

This listing helps illustrate how to break the custom formatting into three pieces. A for loop is used to create a negative number, increment the number to zero, and finally increment it to a positive number. The result is that the same WriteLine can be used to display all three values. This is done three separate times for three different examples.

In line 13, you see that the positive value will be printed to at least three digits because there are three zeros in the first formatting position. The negative number will include a negative sign followed by at least 5 numbers. You know this because the dash is included in the format for the negative sign, and there are five zeros. If the value is equal to zero, a zero will be printed.

In the second example, text is included with the formatting of the numbers. This is also done in the third example. The difference is that in the second example, zero placeholders are also included so the actual numbers will print. This is not the case with the third example where only text is displayed.

As you can see by all three of these examples, it is easy to cause different formats to be used based on the sign (positive or negative) of a variable.

For More Information...

Check out my previous article on formatting dates and times. Additionally, you can get more information from my book, Sams Teach Yourself C# in 21 Days.

About the Author

Bradley Jones

Bradley Jones, in addition to managing CodeGuru, Brad! oversees the Newtwork of sites including Codeguru,, DevX, VBForums, and over a dozen more with a focus on software development and database technologies. His experience includes development in C, C++, VB, some Java, C#, ASP, COBOL, and more as well as having been a developer, consultant, analyst, lead, and much more. His recent books include Teach Yourself the C# Language in 21 Days, Web 2.0 Heroes, and Windows Live Essentials and Services.
Google+ Profile | Linked-In Profile | Facebook Page


  • Interesting Article

    Posted by Brad Jones on 02/23/2004 11:26am

    This is a style of formatting that is not used very often.


    Posted by Legacy on 03/22/2003 12:00am

    Originally posted by: Ernie

    A link to the previous article would be nice.

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: November 20, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT Are you wanting to target two or more platforms such as iOS, Android, and/or Windows? You are not alone. 90% of enterprises today are targeting two or more platforms. Attend this eSeminar to discover how mobile app developers can rely on one IDE to create applications across platforms and approaches (web, native, and/or hybrid), saving time, money, and effort and introducing apps to market faster. You'll learn the trade-offs for gaining long …

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds