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"); } }
/// <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"]); } }
/// <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"]); } }
/// <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"]); } }