home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / VCAFE.3.0A / Main.bin / Integer.java < prev    next >
Text File  |  1998-09-22  |  23KB  |  686 lines

  1. /*
  2.  * @(#)Integer.java    1.43 98/07/07
  3.  *
  4.  * Copyright 1995-1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  * 
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. package java.lang;
  16.  
  17. /**
  18.  * The Integer class wraps a value of the primitive type <code>int</code> 
  19.  * in an object. An object of type <code>Integer</code> contains a 
  20.  * single field whose type is <code>int</code>. 
  21.  * <p>
  22.  * In addition, this class provides several methods for converting 
  23.  * an <code>int</code> to a <code>String</code> and a 
  24.  * <code>String</code> to an <code>int</code>, as well as other 
  25.  * constants and methods useful when dealing with an 
  26.  * <code>int</code>. 
  27.  *
  28.  * @author  Lee Boynton
  29.  * @author  Arthur van Hoff
  30.  * @version 1.43, 07/07/98
  31.  * @since   JDK1.0
  32.  */
  33. public final
  34. class Integer extends Number {
  35.     /**
  36.      * The smallest value of type <code>int</code>. 
  37.      *
  38.      * @since   JDK1.0
  39.      */
  40.     public static final int   MIN_VALUE = 0x80000000;
  41.  
  42.     /**
  43.      * The largest value of type <code>int</code>. 
  44.      *
  45.      * @since   JDK1.0
  46.      */
  47.     public static final int   MAX_VALUE = 0x7fffffff;
  48.  
  49.     /**
  50.      * The Class object representing the primitive type int.
  51.      *
  52.      * @since   JDK1.1
  53.      */
  54.     public static final Class    TYPE = Class.getPrimitiveClass("int");
  55.  
  56.     /**
  57.      * All possible chars for representing a number as a String 
  58.      */
  59.     final static char[] digits = { 
  60.     '0' , '1' , '2' , '3' , '4' , '5' , 
  61.     '6' , '7' , '8' , '9' , 'a' , 'b' , 
  62.     'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 
  63.     'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 
  64.     'o' , 'p' , 'q' , 'r' , 's' , 't' , 
  65.     'u' , 'v' , 'w' , 'x' , 'y' , 'z' 
  66.     };
  67.     
  68.     /**
  69.      * Array of chars to lookup the char for the digit in the tenth's 
  70.      * place for a two digit, base ten number.  The char can be got by 
  71.      * using the number as the index.
  72.      */
  73.     private final static char[] radixTenTenths = {
  74.     '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 
  75.     '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', 
  76.     '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', 
  77.     '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', 
  78.     '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', 
  79.     '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', 
  80.     '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', 
  81.     '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', 
  82.     '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', 
  83.     '9', '9', '9', '9', '9', '9', '9', '9', '9', '9'
  84.     };
  85.     
  86.     /**
  87.      * Array of chars to lookup the char for the digit in the unit's 
  88.      * place for a two digit, base ten number.  The char can be got by 
  89.      * using the number as the index.
  90.      */
  91.     private final static char[] radixTenUnits = {
  92.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  93.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  94.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  95.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  96.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  97.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  98.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  99.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  100.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
  101.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
  102.     };
  103.  
  104.     /**
  105.      * Creates a string representation of the first argument in the 
  106.      * radix specified by the second argument. 
  107.      * <p>
  108.      * If the radix is smaller than <code>Character.MIN_RADIX</code> or 
  109.      * larger than <code>Character.MAX_RADIX</code>, then the radix 
  110.      * <code>10</code> is used instead. 
  111.      * <p>
  112.      * If the first argument is negative, the first element of the 
  113.      * result is the ASCII minus character <code>'-'</code>. If the first 
  114.      * argument is not negative, no sign character appears in the result. 
  115.      * The following ASCII characters are used as digits: 
  116.      * <ul><code>
  117.      *   0123456789abcdefghijklmnopqrstuvwxyz
  118.      * </code></ul>
  119.      *
  120.      * @param   i       an integer.
  121.      * @param   radix   the radix.
  122.      * @return  a string representation of the argument in the specified radix.
  123.      * @see     java.lang.Character#MAX_RADIX
  124.      * @see     java.lang.Character#MIN_RADIX
  125.      * @since   JDK1.0
  126.      */
  127.     public static String toString(int i, int radix) {
  128.     if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
  129.         radix = 10;
  130.     
  131.     /* Use the faster version */
  132.     if (radix == 10) {
  133.         return toString(i);
  134.     }
  135.     
  136.     char buf[] = new char[33];
  137.     boolean negative = (i < 0);
  138.     int charPos = 32;
  139.         
  140.     if (!negative) {
  141.         i = -i;
  142.     }
  143.             
  144.     while (i <= -radix) {
  145.         buf[charPos--] = digits[-(i % radix)];
  146.         i = i / radix;
  147.     }
  148.     buf[charPos] = digits[-i];
  149.  
  150.     if (negative) {
  151.         buf[--charPos] = '-';
  152.     }
  153.  
  154.     return new String(buf, charPos, (33 - charPos));
  155.     }
  156.  
  157.     /**
  158.      * Creates a string representation of the integer argument as an 
  159.      * unsigned integer in base 16. 
  160.      * <p>
  161.      * The unsigned integer value is the argument plus 2<sup>32</sup> if 
  162.      * the argument is negative; otherwise, it is equal to the argument. 
  163.      * This value is converted to a string of ASCII digits in hexadecimal 
  164.      * (base 16) with no extra leading <code>0</code>s. 
  165.      *
  166.      * @param   i   an integer.
  167.      * @return  the string representation of the unsigned integer value
  168.      *          represented by the argument in hexadecimal (base 16).
  169.      * @since   JDK1.0.2
  170.      */
  171.     public static String toHexString(int i) {
  172.     return toUnsignedString(i, 4);
  173.     }
  174.  
  175.     /**
  176.      * Creates a string representation of the integer argument as an 
  177.      * unsigned integer in base 8. 
  178.      * <p>
  179.      * The unsigned integer value is the argument plus 2<sup>32</sup> if 
  180.      * the argument is negative; otherwise, it is equal to the argument. 
  181.      * This value is converted to a string of ASCII digits in octal 
  182.      * (base 8) with no extra leading <code>0</code>s. 
  183.      *
  184.      * @param   i   an integer
  185.      * @return  the string representation of the unsigned integer value
  186.      *          represented by the argument in octal (base&mnsp;8).
  187.      * @since   JDK1.0.2
  188.      */
  189.     public static String toOctalString(int i) {
  190.     return toUnsignedString(i, 3);
  191.     }
  192.  
  193.     /**
  194.      * Creates a string representation of the integer argument as an 
  195.      * unsigned integer in base 2. 
  196.      * <p>
  197.      * The unsigned integer value is the argument plus 2<sup>32</sup>if 
  198.      * the argument is negative; otherwise it is equal to the argument. 
  199.      * This value is converted to a string of ASCII digits in binary 
  200.      * (base 2) with no extra leading <code>0</code>s. 
  201.      *
  202.      * @param   i   an integer.
  203.      * @return  the string representation of the unsigned integer value
  204.      *          represented by the argument in binary (base 2).
  205.      * @since   JDK1.0.2
  206.      */
  207.     public static String toBinaryString(int i) {
  208.     return toUnsignedString(i, 1);
  209.     }
  210.  
  211.     /** 
  212.      * Convert the integer to an unsigned number.
  213.      */
  214.     private static String toUnsignedString(int i, int shift) {
  215.     char[] buf = new char[32];
  216.     int charPos = 32;
  217.     int radix = 1 << shift;
  218.     int mask = radix - 1;
  219.     do {
  220.         buf[--charPos] = digits[i & mask];
  221.         i >>>= shift;
  222.     } while (i != 0);
  223.     
  224.     return new String(buf, charPos, (32 - charPos));
  225.     }
  226.  
  227.     /**
  228.      * Returns a new String object representing the specified integer. The radix
  229.      * is assumed to be 10.
  230.      *
  231.      * @param   i   an integer to be converted.
  232.      * @return  a string representation of the argument in base 10.
  233.      * @since   JDK1.0
  234.      */
  235.     public static String toString(int i) {
  236.     /** 
  237.      * Performance improvements -
  238.      *
  239.      * 1) Avoid a method call and radix checks by inlining the code for 
  240.      *    radix = 10 in this method.
  241.      * 2) Use char arrays instead of StringBuffer and avoid calls to
  242.      *    Character.forDigit.
  243.      * 3) Do computations in positive space to avoid negation each time
  244.      *    around the loop.
  245.      * 4) Unroll loop by half and use a static array of chars to look-
  246.      *    up chars for a digit.
  247.      * The other option for 4) was to use a switch statement and assign 
  248.      * the char for the current digit.  That was a little slower than 4)
  249.      * with most jits. 
  250.      * Speed-up = (approximately) 4x on both Solaris and Win32.
  251.      */
  252.     char[] buf = new char[12];
  253.     boolean negative = (i < 0);
  254.     int charPos = 12;
  255.     
  256.     if (i == Integer.MIN_VALUE) {
  257.         return "-2147483648";
  258.     }
  259.         
  260.     if (negative) {
  261.         i = -i;
  262.     }
  263.     
  264.     do {
  265.         int digit = i%100;
  266.         buf[--charPos] = radixTenUnits[digit];
  267.         buf[--charPos] = radixTenTenths[digit];
  268.         i = i / 100;
  269.     } while(i != 0);
  270.     
  271.     if (buf[charPos] == '0') {
  272.         charPos++;
  273.     }
  274.     if (negative) {
  275.         buf[--charPos] = '-';
  276.     }
  277.         
  278.     return new String(buf , charPos , (12 - charPos));
  279.     }
  280.     
  281.     /**
  282.      * Parses the string argument as a signed integer in the radix 
  283.      * specified by the second argument. The characters in the string 
  284.      * must all be digits of the specified radix (as determined by 
  285.      * whether <code>Character.digit</code> returns a 
  286.      * nonnegative value), except that the first character may be an 
  287.      * ASCII minus sign <code>'-'</code> to indicate a negative value. 
  288.      * The resulting integer value is returned. 
  289.      *
  290.      * @param      s   the <code>String</code> containing the integer.
  291.      * @param      radix   the radix to be used.
  292.      * @return     the integer represented by the string argument in the
  293.      *             specified radix.
  294.      * @exception  NumberFormatException  if the string does not contain a
  295.      *               parsable integer.
  296.  
  297.      * @since      JDK1.0
  298.      */
  299.     public static int parseInt(String s, int radix) 
  300.         throws NumberFormatException 
  301.     {
  302.         if (s == null) {
  303.             throw new NumberFormatException("null");
  304.         }
  305.  
  306.     if (radix < Character.MIN_RADIX) {
  307.         throw new NumberFormatException("radix " + radix + 
  308.                         " less than Character.MIN_RADIX");
  309.     }
  310.     
  311.     if (radix > Character.MAX_RADIX) {
  312.         throw new NumberFormatException("radix " + radix + 
  313.                         " greater than Character.MAX_RADIX");
  314.     }
  315.         
  316.     int result = 0;
  317.     boolean negative = false;
  318.     int i = 0, max = s.length();
  319.     int limit;
  320.     int multmin;
  321.     int digit;
  322.  
  323.     if (max > 0) {
  324.         if (s.charAt(0) == '-') {
  325.         negative = true;
  326.         limit = Integer.MIN_VALUE;
  327.         i++;
  328.         } else {
  329.         limit = -Integer.MAX_VALUE;
  330.         }
  331.         multmin = limit / radix;
  332.         if (i < max) {
  333.         digit = Character.digit(s.charAt(i++),radix);
  334.         if (digit < 0) {
  335.             throw new NumberFormatException(s);
  336.         } else {
  337.             result = -digit;
  338.         }
  339.         }
  340.         while (i < max) {
  341.         // Accumulating negatively avoids surprises near MAX_VALUE
  342.         digit = Character.digit(s.charAt(i++),radix);
  343.         if (digit < 0) {
  344.             throw new NumberFormatException(s);
  345.         }
  346.         if (result < multmin) {
  347.             throw new NumberFormatException(s);
  348.         }
  349.         result *= radix;
  350.         if (result < limit + digit) {
  351.             throw new NumberFormatException(s);
  352.         }
  353.         result -= digit;
  354.         }
  355.     } else {
  356.         throw new NumberFormatException(s);
  357.     }
  358.     if (negative) {
  359.         if (i > 1) {
  360.         return result;
  361.         } else {    /* Only got "-" */
  362.         throw new NumberFormatException(s);
  363.         }
  364.     } else {
  365.         return -result;
  366.     }
  367.     }
  368.  
  369.     /**
  370.      * Parses the string argument as a signed decimal integer. The 
  371.      * characters in the string must all be decimal digits, except that 
  372.      * the first character may be an ASCII minus sign <code>'-'</code> to 
  373.      * indicate a negative value. 
  374.      *
  375.      * @param      s   a string.
  376.      * @return     the integer represented by the argument in decimal.
  377.      * @exception  NumberFormatException  if the string does not contain a
  378.      *               parsable integer.
  379.      * @since      JDK1.0
  380.      */
  381.     public static int parseInt(String s) throws NumberFormatException {
  382.     return parseInt(s,10);
  383.     }
  384.  
  385.     /**
  386.      * Returns a new Integer object initialized to the value of the
  387.      * specified String.  Throws an exception if the String cannot be
  388.      * parsed as an int.
  389.      *
  390.      * @param      s   the string to be parsed.
  391.      * @return     a newly constructed <code>Integer</code> initialized to the
  392.      *             value represented by the string argument in the specified
  393.      *             radix.
  394.      * @exception  NumberFormatException  if the <code>String</code> does not
  395.      *               contain a parsable integer.
  396.      * @since   JDK1.0
  397.      */
  398.     public static Integer valueOf(String s, int radix) throws NumberFormatException {
  399.     return new Integer(parseInt(s,radix));
  400.     }
  401.  
  402.     /**
  403.      * Returns a new Integer object initialized to the value of the
  404.      * specified String.  Throws an exception if the String cannot be
  405.      * parsed as an int. The radix is assumed to be 10.
  406.      *
  407.      * @param      s   the string to be parsed.
  408.      * @return     a newly constructed <code>Integer</code> initialized to the
  409.      *             value represented by the string argument.
  410.      * @exception  NumberFormatException  if the string does not contain a
  411.      *               parsable integer.
  412.      * @since   JDK1.0
  413.      */
  414.     public static Integer valueOf(String s) throws NumberFormatException
  415.     {
  416.     return new Integer(parseInt(s, 10));
  417.     }
  418.  
  419.     /**
  420.      * The value of the Integer.
  421.      */
  422.     private int value;
  423.  
  424.     /**
  425.      * Constructs a newly allocated <code>Integer</code> object that 
  426.      * represents the primitive <code>int</code> argument. 
  427.      *
  428.      * @param   value   the value to be represented by the <code>Integer</code>.
  429.      * @since   JDK1.0
  430.      */
  431.     public Integer(int value) {
  432.     this.value = value;
  433.     }
  434.  
  435.     /**
  436.      * Constructs a newly allocated <code>Integer</code> object that 
  437.      * represents the value represented by the string. The string is 
  438.      * converted to an int value as if by the <code>valueOf</code> method. 
  439.      *
  440.      * @param      s   the <code>String</code> to be converted to an
  441.      *                 <code>Integer</code>.
  442.      * @exception  NumberFormatException  if the <code>String</code> does not
  443.      *               contain a parsable integer.
  444.      * @see        java.lang.Integer#valueOf(java.lang.String, int)
  445.      * @since      JDK1.0
  446.      */
  447.     public Integer(String s) throws NumberFormatException {
  448.     this.value = parseInt(s, 10);
  449.     }
  450.  
  451.     /**
  452.      * Returns the value of this Integer as a byte.
  453.      *
  454.      * @since   JDK1.1
  455.      */
  456.     public byte byteValue() {
  457.     return (byte)value;
  458.     }
  459.  
  460.     /**
  461.      * Returns the value of this Integer as a short.
  462.      *
  463.      * @since   JDK1.1
  464.      */
  465.     public short shortValue() {
  466.     return (short)value;
  467.     }
  468.  
  469.     /**
  470.      * Returns the value of this Integer as an int.
  471.      *
  472.      * @return  the <code>int</code> value represented by this object.
  473.      * @since   JDK1.0
  474.      */
  475.     public int intValue() {
  476.     return value;
  477.     }
  478.  
  479.     /**
  480.      * Returns the value of this Integer as a long.
  481.      *
  482.      * @return  the <code>int</code> value represented by this object that is
  483.      *          converted to type <code>long</code> and the result of the
  484.      *          conversion is returned.
  485.      * @since   JDK1.0
  486.      */
  487.     public long longValue() {
  488.     return (long)value;
  489.     }
  490.  
  491.     /**
  492.      * Returns the value of this Integer as a float.
  493.      *
  494.      * @return  the <code>int</code> value represented by this object is
  495.      *          converted to type <code>float</code> and the result of the
  496.      *          conversion is returned.
  497.      * @since   JDK1.0
  498.      */
  499.     public float floatValue() {
  500.     return (float)value;
  501.     }
  502.  
  503.     /**
  504.      * Returns the value of this Integer as a double.
  505.      *
  506.      * @return  the <code>int</code> value represented by this object is
  507.      *          converted to type <code>double</code> and the result of the
  508.      *          conversion is returned.
  509.      * @since   JDK1.0
  510.      */
  511.     public double doubleValue() {
  512.     return (double)value;
  513.     }
  514.  
  515.     /**
  516.      * Returns a String object representing this Integer's value.
  517.      *
  518.      * @return  a string representation of the value of this object in
  519.      *          base 10.
  520.      * @since   JDK1.0
  521.      */
  522.     public String toString() {
  523.     return String.valueOf(value);
  524.     }
  525.  
  526.     /**
  527.      * Returns a hashcode for this Integer.
  528.      *
  529.      * @return  a hash code value for this object. 
  530.      * @since   JDK1.0
  531.      */
  532.     public int hashCode() {
  533.     return value;
  534.     }
  535.  
  536.     /**
  537.      * Compares this object to the specified object.
  538.      * The result is <code>true</code> if and only if the argument is not 
  539.      * <code>null</code> and is an <code>Integer</code> object that contains 
  540.      * the same <code>int</code> value as this object. 
  541.      *
  542.      * @param   obj   the object to compare with.
  543.      * @return  <code>true</code> if the objects are the same;
  544.      *          <code>false</code> otherwise.
  545.      * @since   JDK1.0
  546.      */
  547.     public boolean equals(Object obj) {
  548.     if ((obj != null) && (obj instanceof Integer)) {
  549.         return value == ((Integer)obj).intValue();
  550.     }
  551.     return false;
  552.     }
  553.  
  554.     /**
  555.      * Determines the integer value of the system property with the 
  556.      * specified name. 
  557.      * <p>
  558.      * The first argument is treated as the name of a system property. 
  559.      * System properties are accessible through <code>getProperty</code>  
  560.      * and , a method defined by the <code>System</code> class. The 
  561.      * string value of this property is then interpreted as an integer 
  562.      * value and an <code>Integer</code> object representing this value is 
  563.      * returned. Details of possible numeric formats can be found with 
  564.      * the definition of <code>getProperty</code>. 
  565.      * <p>
  566.      * If there is no property with the specified name, or if the 
  567.      * property does not have the correct numeric format, then 
  568.      * <code>null</code> is returned. 
  569.      *
  570.      * @param   nm   property name.
  571.      * @return  the <code>Integer</code> value of the property.
  572.      * @see     java.lang.System#getProperty(java.lang.String)
  573.      * @see     java.lang.System#getProperty(java.lang.String, java.lang.String)
  574.      * @since   JDK1.0
  575.      */
  576.     public static Integer getInteger(String nm) {
  577.     SecurityManager sm = System.getSecurityManager();
  578.     if (sm != null)
  579.         sm.checkPropertyAccess(nm);
  580.     return getInteger(nm, null);
  581.     }
  582.  
  583.     /**
  584.      * Determines the integer value of the system property with the 
  585.      * specified name. 
  586.      * <p>
  587.      * The first argument is treated as the name of a system property. 
  588.      * System properties are accessible through <code>getProperty</code>  
  589.      * and , a method defined by the <code>System</code> class. The 
  590.      * string value of this property is then interpreted as an integer 
  591.      * value and an <code>Integer</code> object representing this value is 
  592.      * returned. Details of possible numeric formats can be found with 
  593.      * the definition of <code>getProperty</code>. 
  594.      * <p>
  595.      * If there is no property with the specified name, or if the 
  596.      * property does not have the correct numeric format, then an 
  597.      * <code>Integer</code> object that represents the value of the 
  598.      * second argument is returned. 
  599.      *
  600.      * @param   nm   property name.
  601.      * @param   val   default value.
  602.      * @return  the <code>Integer</code> value of the property.
  603.      * @see     java.lang.System#getProperty(java.lang.String)
  604.      * @see     java.lang.System#getProperty(java.lang.String, java.lang.String)
  605.      * @since   JDK1.0
  606.      */
  607.     public static Integer getInteger(String nm, int val) {
  608.     SecurityManager sm = System.getSecurityManager();
  609.     if (sm != null)
  610.         sm.checkPropertyAccess(nm);
  611.         Integer result = getInteger(nm, null);
  612.         return (result == null) ? new Integer(val) : result;
  613.     }
  614.  
  615.     /**
  616.      * Determines the integer value of the system property with the 
  617.      * specified name. 
  618.      * <p>
  619.      * The first argument is treated as the name of a system property. 
  620.      * System properties are accessible through <code>getProperty</code>  
  621.      * and , a method defined by the <code>System</code> class. The 
  622.      * string value of this property is then interpreted as an integer 
  623.      * value and an <code>Integer</code> object representing this value is 
  624.      * returned. 
  625.      * <p>
  626.      * If the property value begins with "<code>0x</code>" or 
  627.      * "<code>#</code>", not followed by a minus sign, the rest 
  628.      * of it is parsed as a hexadecimal integer exactly as for the method 
  629.      * <code>Integer.valueOf</code> with radix 16. 
  630.      * <p>
  631.      * If the property value begins with "<code>0</code>" then 
  632.      * it is parsed as an octal integer exactly as for the method 
  633.      * <code>Integer.valueOf</code> with radix 8. 
  634.      * <p>
  635.      * Otherwise the property value is parsed as a decimal integer 
  636.      * exactly as for the method <code>Integer.valueOf</code> with radix 10.
  637.      * <p>
  638.      * The second argument is the default value. If there is no property 
  639.      * of the specified name, or if the property does not have the 
  640.      * correct numeric format, then the second argument is returned. 
  641.      *
  642.      * @param   nm   property name.
  643.      * @param   val   default value.
  644.      * @return  the <code>Integer</code> value of the property.
  645.      * @see     java.lang.System#getProperty(java.lang.String)
  646.      * @see     java.lang.System#getProperty(java.lang.String, java.lang.String)
  647.      * @since   JDK1.0
  648.      */
  649.     public static Integer getInteger(String nm, Integer val) {
  650.     SecurityManager sm = System.getSecurityManager();
  651.     if (sm != null)
  652.         sm.checkPropertyAccess(nm);
  653.     String v = System.getProperty(nm);
  654.     if (v != null) {
  655.         try {
  656.         return Integer.decode(v);
  657.         } catch (NumberFormatException e) {
  658.         }
  659.     }    
  660.     return val;
  661.     }
  662.  
  663.     /**
  664.      * Decodes a string into an Integer. Deals with decimal, hexadecimal,
  665.      * and octal numbers.
  666.      * @param nm the string to decode
  667.      * @since   JDK1.1
  668.      */
  669.     public static Integer decode(String nm) throws NumberFormatException {
  670.     if (nm.startsWith("0x")) {
  671.         return Integer.valueOf(nm.substring(2), 16);
  672.     }
  673.     if (nm.startsWith("#")) {
  674.         return Integer.valueOf(nm.substring(1), 16);
  675.     }
  676.     if (nm.startsWith("0") && nm.length() > 1) {
  677.         return Integer.valueOf(nm.substring(1), 8);
  678.     }
  679.     
  680.     return Integer.valueOf(nm);
  681.     }
  682.  
  683.     /** use serialVersionUID from JDK 1.0.2 for interoperability */
  684.     private static final long serialVersionUID = 1360826667806852920L;
  685. }
  686.