The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ NumberPrototype

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Globalization;
  20.     using System.Text;
  21.    
  22.     public class NumberPrototype : NumberObject
  23.     {
  24.         static internal readonly NumberPrototype ob = new NumberPrototype(ObjectPrototype.ob);
  25.         static internal NumberConstructor _constructor;
  26.        
  27.         internal NumberPrototype(ObjectPrototype parent) : base(parent, 0.0)
  28.         {
  29.             this.noExpando = true;
  30.             //this.constructor is given a value by the proper constructor class
  31.         }
  32.        
  33.         public static NumberConstructor constructor {
  34.             get { return NumberPrototype._constructor; }
  35.         }
  36.        
  37.         private static double ThisobToDouble(object thisob)
  38.         {
  39.             thisob = NumberPrototype.valueOf(thisob);
  40.             return ((IConvertible)thisob).ToDouble(null);
  41.         }
  42.        
  43.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_toExponential)]
  44.         public static string toExponential(object thisob, object fractionDigits)
  45.         {
  46.             double value = NumberPrototype.ThisobToDouble(thisob);
  47.             double f;
  48.             if (fractionDigits == null || fractionDigits is Missing)
  49.                 f = 16;
  50.             else
  51.                 f = Convert.ToInteger(fractionDigits);
  52.             if (f < 0 || f > 20)
  53.                 throw new JScriptException(JSError.FractionOutOfRange);
  54.             StringBuilder fmt = new StringBuilder("#.");
  55.             for (int i = 0; i < f; i++)
  56.                 fmt.Append('0');
  57.             fmt.Append("e+0");
  58.             return value.ToString(fmt.ToString(), CultureInfo.InvariantCulture);
  59.         }
  60.        
  61.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_toFixed)]
  62.         public static string toFixed(object thisob, double fractionDigits)
  63.         {
  64.             double value = NumberPrototype.ThisobToDouble(thisob);
  65.             if (Double.IsNaN(fractionDigits))
  66.                 fractionDigits = 0;
  67.             else if (fractionDigits < 0 || fractionDigits > 20)
  68.                 throw new JScriptException(JSError.FractionOutOfRange);
  69.             return value.ToString("f" + ((int)fractionDigits).ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);
  70.         }
  71.        
  72.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_toLocaleString)]
  73.         public static string toLocaleString(object thisob)
  74.         {
  75.             return Convert.ToString(NumberPrototype.valueOf(thisob), PreferredType.LocaleString, true);
  76.         }
  77.        
  78.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_toPrecision)]
  79.         public static string toPrecision(object thisob, object precision)
  80.         {
  81.             double value = NumberPrototype.ThisobToDouble(thisob);
  82.             if (precision == null || precision is Missing)
  83.                 return Convert.ToString(value);
  84.             double df = Convert.ToInteger(precision);
  85.             if (df < 1 || df > 21)
  86.                 throw new JScriptException(JSError.PrecisionOutOfRange);
  87.             int f = (int)df;
  88.             if (Double.IsNaN(value))
  89.                 return "NaN";
  90.             if (Double.IsInfinity(value))
  91.                 return value > 0.0 ? "Infinity" : "-Infinity";
  92.             string sign;
  93.             if (value >= 0.0)
  94.                 sign = "";
  95.             else {
  96.                 sign = "-";
  97.                 value = -value;
  98.             }
  99.             string mant = value.ToString("e" + (f - 1).ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);
  100.             int exp = Int32.Parse(mant.Substring(mant.Length - 4), CultureInfo.InvariantCulture);
  101.             mant = mant.Substring(0, 1) + mant.Substring(2, f - 1);
  102.             if (exp >= f || exp < -6)
  103.                 return sign + mant.Substring(0, 1) + (f > 1 ? "." + mant.Substring(1) : "") + (exp >= 0 ? "e+" : "e") + exp.ToString(CultureInfo.InvariantCulture);
  104.             if (exp == f - 1)
  105.                 return sign + mant;
  106.             if (exp >= 0)
  107.                 return sign + mant.Substring(0, exp + 1) + "." + mant.Substring(exp + 1);
  108.             return sign + "0." + mant.PadLeft(f - exp - 1, '0');
  109.         }
  110.        
  111.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_toString)]
  112.         public static string toString(object thisob, object radix)
  113.         {
  114.             int rdx = 10;
  115.             if (radix is IConvertible) {
  116.                 double rd = ((IConvertible)radix).ToDouble(CultureInfo.InvariantCulture);
  117.                 int ri = (int)rd;
  118.                 if (rd == (double)ri)
  119.                     rdx = ri;
  120.             }
  121.             if (rdx < 2 || rdx > 36)
  122.                 rdx = 10;
  123.             return Convert.ToString(NumberPrototype.valueOf(thisob), rdx);
  124.         }
  125.        
  126.         [JSFunctionAttribute(JSFunctionAttributeEnum.HasThisObject, JSBuiltin.Number_valueOf)]
  127.         public static object valueOf(object thisob)
  128.         {
  129.             if (thisob is NumberObject)
  130.                 return ((NumberObject)thisob).value;
  131.             switch (Convert.GetTypeCode(thisob)) {
  132.                 case TypeCode.SByte:
  133.                 case TypeCode.Byte:
  134.                 case TypeCode.Int16:
  135.                 case TypeCode.UInt16:
  136.                 case TypeCode.Int32:
  137.                 case TypeCode.UInt32:
  138.                 case TypeCode.Int64:
  139.                 case TypeCode.UInt64:
  140.                 case TypeCode.Single:
  141.                 case TypeCode.Double:
  142.                     return thisob;
  143.             }
  144.             throw new JScriptException(JSError.NumberExpected);
  145.         }
  146.        
  147.     }
  148. }

Developer Fusion