Esempio n. 1
0
        public JsObject Wrap(object value)
        {
            switch (Convert.GetTypeCode(value))
            {
            case TypeCode.Boolean:
                return(BooleanClass.New((bool)value));

            case TypeCode.Char:
            case TypeCode.String:
                return(StringClass.New(Convert.ToString(value)));

            case TypeCode.DateTime:
                return(DateClass.New((DateTime)value));

            case TypeCode.Byte:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
            case TypeCode.SByte:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
            case TypeCode.Decimal:
            case TypeCode.Double:
            case TypeCode.Single:
                return(NumberClass.New(Convert.ToDouble(value)));

            case TypeCode.Object:
                return(ObjectClass.New(value));

            case TypeCode.DBNull:
            case TypeCode.Empty:
            default:
                throw new ArgumentNullException("value");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 15.1.2.3
        /// </summary>
        public JsInstance ParseFloat(JsInstance[] arguments)
        {
            if (arguments.Length < 1 || arguments[0] == JsUndefined.Instance)
            {
                return(JsUndefined.Instance);
            }

            string number = arguments[0].ToString().Trim();
            // the parseFloat function should stop parsing when it encounters an unalowed char
            Regex regexp = new Regex(@"^[\+\-\d\.e]*", RegexOptions.IgnoreCase);

            Match match = regexp.Match(number);

            double result;

            if (match.Success && double.TryParse(match.Value, NumberStyles.Float, new CultureInfo("en-US"), out result))
            {
                return(NumberClass.New(result));
            }
            else
            {
                return(this["NaN"]);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 15.1.2.2
        /// </summary>
        public JsInstance ParseInt(JsInstance[] arguments)
        {
            if (arguments.Length < 1 || arguments[0] == JsUndefined.Instance)
            {
                return(JsUndefined.Instance);
            }

            //in case of an enum, just cast it to an integer
            if (arguments[0].IsClr && arguments[0].Value.GetType().IsEnum)
            {
                return(NumberClass.New((int)arguments[0].Value));
            }

            string number = arguments[0].ToString().Trim();
            int    sign   = 1;
            int    radix  = 10;

            if (number == String.Empty)
            {
                return(this["NaN"]);
            }

            if (number.StartsWith("-"))
            {
                number = number.Substring(1);
                sign   = -1;
            }
            else if (number.StartsWith("+"))
            {
                number = number.Substring(1);
            }

            if (arguments.Length >= 2)
            {
                if (arguments[1] != JsUndefined.Instance && !0.Equals(arguments[1]))
                {
                    radix = Convert.ToInt32(arguments[1].Value);
                }
            }

            if (radix == 0)
            {
                radix = 10;
            }
            else if (radix < 2 || radix > 36)
            {
                return(this["NaN"]);
            }

            if (number.ToLower().StartsWith("0x"))
            {
                radix = 16;
            }

            try {
                if (radix == 10)
                {
                    // most common case
                    double result;
                    if (double.TryParse(number, NumberStyles.Any, CultureInfo.InvariantCulture, out result))
                    {
                        // parseInt(12.42) == 42
                        return(NumberClass.New(sign * Math.Floor(result)));
                    }
                    else
                    {
                        return(this["NaN"]);
                    }
                }
                else
                {
                    return(NumberClass.New(sign * Convert.ToInt32(number, radix)));
                }
            }
            catch {
                return(this["NaN"]);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 15.1.2.2
        /// </summary>
        public JsInstance ParseInt(JsInstance[] arguments)
        {
            if (arguments.Length < 1 || arguments[0] == JsUndefined.Instance)
            {
                return(JsUndefined.Instance);
            }

            //in case of an enum, just cast it to an integer
            if (arguments[0].IsClr && arguments[0].Value.GetType().IsEnum)
            {
                return(NumberClass.New((int)arguments[0].Value));
            }

            string number = arguments[0].ToString().Trim();
            int    sign   = 1;
            int    radix  = 10;

            if (number == String.Empty)
            {
                return(this["NaN"]);
            }

            if (number.StartsWith("-"))
            {
                number = number.Substring(1);
                sign   = -1;
            }
            else if (number.StartsWith("+"))
            {
                number = number.Substring(1);
            }

            if (arguments.Length >= 2)
            {
                if (arguments[1] != JsUndefined.Instance && !0.Equals(arguments[1]))
                {
                    radix = Convert.ToInt32(arguments[1].Value);
                }
            }

            if (radix == 0)
            {
                radix = 10;
            }
            else if (radix < 2 || radix > 36)
            {
                return(this["NaN"]);
            }

            if (number.ToLower().StartsWith("0x"))
            {
                radix = 16;
            }

            try {
                return(NumberClass.New(sign * Convert.ToInt32(number, radix)));
            }
            catch {
                return(this["NaN"]);
            }
        }