Recipe 5.2 Converting Between Different Number Systems

5.2.1 Problem

You want to convert a number between different bases (decimal, binary, hexadecimal, etc.).

5.2.2 Solution

Use the parseInt( ) function with the radix parameter (the radix is the number's base) to convert a string to a decimal representation. Use the Number.toString( ) method with the radix parameter to convert a decimal number to a string representation of the value in another base.

5.2.3 Discussion

No matter how you set a number value in ActionScript, the result is always retrieved as a decimal (base-10) number.

// Create a Color object.
myColor = new Color(this);

// Set the RGB value as a hexadecimal.

// This displays the value as decimal: 16126635
trace(myColor.getRGB(  ));

However, if you want to output a value in a different base, you can use Number.toString(radix) to convert any number value to a string representing that number in the specified base.

These two examples convert numeric literals to Number objects and output the string representations in base-2 (binary) and base-16 (hexadecimal) format:

// The radix is 2, so output as binary.
trace(new Number(51).toString(2));  // Displays: "110011"
// The radix is 16, so output as hex.
trace(new Number(25).toString(16)); // Displays: "19"

This example assigns a primitive number to a variable and calls the toString( ) method to output the value in hexadecimal:

myNum = 164;
trace(myNum.toString(16)); // Displays: "A4"

Note that the results from these examples are not numeric literals, but rather strings, such as "110011", "19", and "A4".

This example sets the RGB value of a Color object, then calls toString( ) on the result to display the value as a hexadecimal (as it had been input, although the alpha digits are converted to lowercase, and the result is a string, not a number):

myColor = new Color(this);
trace(myColor.getRGB(  ).toString(16));  // Displays: "f612ab"

The valid range for the radix parameter of the toString( ) method is from 2 to 36. If you call toString( ) with no radix parameter or an invalid value, decimal format (base-10) is assumed.

You can achieve the inverse of the toString( ) process using the parseInt( ) function with the radix parameter. The parseInt( ) function takes a string value and returns a number. This is useful if you want to work with inputs of bases other than 10.

These examples parse the numbers from the string in base-2 (binary), base-16 (hexadecimal), and base-10, respectively. Note that the result is always a decimal.

trace(parseInt("110011", 2));  // Displays: 51
trace(parseInt("19", 16));     // Displays: 25
trace(parseInt("17", 10));     // Displays: 17

If omitted, the radix is assumed to be 10, unless the string starts with 0X or 0, in which case hexadecimal or octal is assumed:

trace(parseInt("0x12"));     // The radix is implicitly 16. Displays: 18
trace(parseInt("017"));      // The radix is implicitly 8. Displays: 15

An explicit radix overrides an implicit one. In the next example, the result is 0, not 12. When the number is treated as base-10, conversion stops when a nonnumeric character?the x?is encountered.

// The number is treated as a decimal, not a hexadecimal number.
trace(parseInt("0x12", 10));   // Displays: 0 (not 12 or 18)

Here, although the leading zero doesn't prevent the remaining digits from being interpreted, it is treated as a decimal number, not an octal number:

// The number is treated as a decimal, not an octal number.
trace(parseInt("017",  10));   // Displays: 17 (not 15)

Due to a deviation from the ECMA-262 standard, ActionScript gets confused by the "0x" that prefixes a hexadecimal number if you specify an explicit radix of 16. Therefore, if you specify an explicit radix, don't prefix the number with "0x". For example, although the following should, according to the ECMA-262 standard, return the decimal equivalent of 0xA9FC9C, it returns 0 instead:

trace (parseInt("0xA9FC9C", 16));   // Displays: 0

Either of these will work as expected:

trace (parseInt("0xA9FC9C"));     // Displays: 11140252 (implicit radix)
trace (parseInt("A9FC9C", 16));   // Displays: 11140252 (explicit radix)

Conversely, don't forget to include either "0x" or an explicit radix. The following interprets the string as a decimal and returns NaN (Not-a-Number) because "A" can't be converted to an integer:

trace(parseInt("A9FC9C"));       // NaN

    Part I: Local Recipes
    Part II: Remote Recipes