O'Reilly logo

ActionScript 3.0 Cookbook by Joey Lott, Darron Schall, Keith Peters

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Inserting Leading or Trailing Zeros or Spaces

Problem

You want to add leading or trailing zeros or spaces to a number to display it as a string.

Solution

Use the custom NumberFormat class, apply a mask, and then call the format() method.

Discussion

You might need to format numbers with leading or trailing zeros or spaces for display purposes, such as when displaying times or dates. For example, you would want to format 6 hours and 3 minutes as 6:03 or 06:03, not 6:3. Additionally, sometimes you’ll want to apply leading and/or trailing spaces to align the columns of several numbers; for example:

123456789
  1234567
    12345

Although you can certainly work out the algorithms on your own to add leading or trailing characters, you’ll likely find working with a NumberFormat object much faster, simpler, and more flexible. The NumberFormat class is a custom class included with the downloads for this book at http://www.rightactionscript.com/ascb. That class is part of the ascb.util package, so the first thing you’ll want to do is make sure you have an import statement:

import ascb.util.NumberFormat;

Next you need to determine the mask that you’ll use to format the number. The mask can consist of zeros (0), pound signs (#), dots (.), and commas (,); any other characters are disregarded.

Zeros (0)

Placeholders that are either filled with the corresponding digit or a zero.

Pound signs (#)

Placeholders that are either filled with the corresponding digit or a space.

Dots (.)

Decimal point placeholders; they can be replaced by the localized decimal point symbol.

Commas (,)

Placeholders for grouping symbols; they are replaced by the localized grouping symbol.

To better understand this, it can be helpful to take a look at some examples; consider the following mask:

##,###.0000

When the preceding mask is used with the numbers 1.2345, 12.345, 123.45, 1234.5, and 12345, the results are as follows (assuming that the localized settings apply commas as grouping symbols and dots as decimal points):

     1.2345
    12.3450
   123.4500
 1,234.5000
12,345.0000

You can set the mask for a NumberFormat object in several ways. You can specify the mask as a parameter when you construct the object, as follows:

var styler:NumberFormat = new NumberFormat("##,###.0000");

Additionally, you can use the mask property of the object to change the mask at any point:

styler.mask = "##.00";

Tip

The mask property is a read-write property, so you can also retrieve the current mask string by reading the value from the property.

Once a mask has been applied to a NumberFormat object, you can format any number value by calling the format() method and passing the number as a parameter:

trace(styler.format(12345);

The following code is a complete, working example that illustrates the features of the NumberFormat class that have been discussed so far:

var styler:NumberFormat = new NumberFormat("#,###,###,###");

trace(styler.format(1));
trace(styler.format(12));
trace(styler.format(123));
trace(styler.format(1234));

styler.mask = "#,###,###,###.0000";

trace(styler.format(12345));
trace(styler.format(123456));
trace(styler.format(1234567));
trace(styler.format(12345678));
trace(styler.format(123456789));

The output from the preceding example is as follows (assuming U.S.-style localization settings):

            1
           12
          123
        1,234
       12,345.0000
      123,456.0000
    1,234,567.0000
   12,345,678.0000
  123,456,789.0000

By default, NumberFormat objects attempt to automatically localize the return values. If the Flash Player is running on a U.S. English operating system, the NumberFormat class uses commas as grouping symbols and dots as decimal points. On the other hand, if the computer is running a French operating system, the symbols are reversed; dots for grouping symbols and commas for decimal points. There are several reasons why you may opt to override the automatic localization, including:

  • You want the numbers to be formatted in a standard way regardless of the operating system on which the Flash application is run.

  • Automatic localization doesn’t work properly. This may occur in some situations for at least two reasons:

    • The Locale class (the class used by NumberFormat to determine the correct localization settings) may not include some languages/countries.

    • The Flash Player does not report very specific settings. It only reports the language code. Because of that, it may be difficult—to nearly impossible—to correctly calculate the locale to use.

There are a variety of ways you can override the automatic localization settings:

  • Pass a Locale object to the format() method as a second parameter. The format() method then uses the settings from that Locale object instead of the automatic settings. This option works well when you want to apply different custom localization settings each time you call the format() method. You can create a Locale object by using the constructor. With no parameters, the Locale object uses automatic localization detection, so you’ll want to pass it one or two parameters. The first parameter is the language code (e.g., en). The second parameter is the country code (e.g., US), also called the variant. You should only specify the variant if there are different regions that use the same language, but use different formatting. For example, the language code es (Spanish) could potentially apply to many countries, including Mexico (MX) and Spain (ES)—both of which use different symbols to format numbers.

  • Set the Locale.slanguage and/or Locale.svariant properties to set the localization properties globally. You don’t need to specify any additional parameters when calling format() with this option. Simply assign values to the static properties, Locale.slanguage and/or Locale.svariant; those settings affect any subsequent calls to format().

  • Use a symbols object as the second parameter when calling format(). The symbols object should have two properties: group and decimal. The values for those properties allow you to define the symbols to use when formatting the number. This option is best when the Locale object does not have settings for the locale that you want and/or when you want to use custom formatting symbols.

Tip

The Locale class is in the ascb.util package, so be sure to import that class if you want to use it.

The following example illustrates some of the ways you can override the automatic localization settings:

var styler:NumberFormat = new NumberFormat("#,###,###,###.00");

Locale.slanguage = "fr";
trace(styler.format(1234));
trace(styler.format(12345, {group: ",", decimal: "."}));
trace(styler.format(123456));
Locale.slanguage = "en";
trace(styler.format(1234567));
trace(styler.format(12345678, new Locale("es", "ES")));
trace(styler.format(123456789, {group: "|", decimal: ","}));

The preceding code displays the following:

        1.234,00
       12,345.00
      123.456,00
    1,234,567.00
   12.345.678,00
  123|456|789,00

See Also

Recipes 4.2 and 4.6

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required