Example #1
0
        public static Decimal TryObjectToDecimal(object obj, out ConversionStrictness strictness)
        {
            int    ival;
            long   lval;
            double dval;

            // ignores the higher precision of decimal:
            decimal ret = 0;

            Convert.NumberInfo ni = Convert.ObjectToNumber(obj, out ival, out lval, out dval);
            switch (ni & Convert.NumberInfo.TypeMask)
            {
            case Convert.NumberInfo.Integer: { strictness = ConversionStrictness.ImplExactMatch; ret = ival; break; }

            case Convert.NumberInfo.LongInteger: { strictness = ConversionStrictness.ImplExactMatch; ret = lval; break; }

            case Convert.NumberInfo.Double: { strictness = ConversionStrictness.ImplPercisionLost; ret = unchecked ((decimal)dval); break; }

            case Convert.NumberInfo.Unconvertible: { strictness = ConversionStrictness.Failed; ret = 0; break; }

            default: Debug.Fail(); throw null;
            }
            if (obj is string)
            {
                strictness = ConversionStrictness.ImplDomainChange;
            }
            if (obj is bool)
            {
                strictness = ConversionStrictness.ImplDomainChange;
            }
            if (obj is IPhpConvertible)
            {
                strictness = ConversionStrictness.Explicit;
            }
            if (obj == null)
            {
                strictness = ConversionStrictness.ImplDomainChange;
            }
            return(ret);
        }
Example #2
0
        public static UInt64 TryObjectToUInt64(object obj, out ConversionStrictness strictness)
        {
            string s;

            if (obj is int)
            {
                int ival = (int)obj;
                strictness = ival >= 0 ?
                             ConversionStrictness.ImplExactMatch : ConversionStrictness.Failed;
                return(unchecked ((UInt64)ival));
            }

            if (obj is long)
            {
                long lval = (long)obj;
                strictness = lval >= 0 ?
                             ConversionStrictness.ImplExactMatch : ConversionStrictness.Failed;
                return(unchecked ((UInt64)lval));
            }

            if (obj is bool)
            {
                strictness = ConversionStrictness.ImplDomainChange;
                return((ulong)((bool)obj ? 1 : 0));
            }

            if (obj is double)
            {
                double dval = (double)obj;
                strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ?
                             ConversionStrictness.ImplPercisionLost : ConversionStrictness.Failed;
                return(unchecked ((UInt64)dval));
            }

            if ((s = PhpVariable.AsString(obj)) != null)
            {
                int    ival;
                double dval;
                long   lval;

                // successfull iff the number encoded in the string fits Int32 or Int64:
                Convert.NumberInfo info = Convert.StringToNumber(s, out ival, out lval, out dval);
                if ((info & Convert.NumberInfo.Integer) != 0)
                {
                    strictness = ConversionStrictness.ImplDomainChange; return(unchecked ((UInt64)ival));
                }
                if ((info & Convert.NumberInfo.LongInteger) != 0)
                {
                    strictness = ConversionStrictness.ImplDomainChange; return(unchecked ((UInt64)lval));
                }

                strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ?
                             ConversionStrictness.ImplPercisionLost : ConversionStrictness.Failed;
                return(unchecked ((UInt64)dval));
            }

            // explicit conversion

            /*IPhpConvertible conv;
             * if ((conv = obj as IPhpConvertible) != null)
             * {
             *      int ival;
             *      double dval;
             *      long lval;
             *
             *      Convert.NumberInfo info = conv.ToNumber(out ival, out lval, out dval);
             *      if ((info & Convert.NumberInfo.Integer) != 0)
             *      { strictness = ConversionStrictness.Explicit; return unchecked((UInt64)ival); }
             *      if ((info & Convert.NumberInfo.LongInteger) != 0)
             *      { strictness = ConversionStrictness.Explicit; return unchecked((UInt64)lval); }
             *
             *      strictness = (dval >= UInt64.MinValue && dval <= UInt64.MaxValue) ?
             *              ConversionStrictness.Explicit : ConversionStrictness.Failed;
             *      return unchecked((UInt64)dval);
             * }*/

            strictness = ConversionStrictness.Failed;
            return(0);
        }
Example #3
0
        public static Int32 TryObjectToInt32(object obj, out ConversionStrictness strictness)
        {
            string s;

            if (obj is int)
            {
                strictness = ConversionStrictness.ImplExactMatch; return((int)obj);
            }
            if (obj is bool)
            {
                strictness = ConversionStrictness.ImplDomainChange; return((bool)obj ? 1 : 0);
            }

            if (obj is long)
            {
                long lval = (long)obj;
                if (lval < Int32.MinValue || lval > Int32.MaxValue)
                {
                    strictness = ConversionStrictness.Failed;
                }
                else
                {
                    strictness = ConversionStrictness.ImplExactMatch;
                }
                return(unchecked ((Int32)lval));
            }

            if (obj is double)
            {
                double dval = (double)obj;
                if (dval < Int32.MinValue || dval > Int32.MaxValue)
                {
                    strictness = ConversionStrictness.Failed;
                }
                else
                {
                    strictness = ConversionStrictness.ImplPercisionLost;
                }
                return(unchecked ((Int32)dval));
            }

            if ((s = PhpVariable.AsString(obj)) != null)
            {
                int    ival;
                double dval;
                long   lval;

                // successfull iff the number encoded in the string fits the Int32:
                Convert.NumberInfo info = Convert.StringToNumber(s, out ival, out lval, out dval);
                if ((info & Convert.NumberInfo.Integer) != 0)
                {
                    strictness = ConversionStrictness.ImplDomainChange; return(ival);
                }                                                                                    // "123 hello world" -> 123 (for example)

                strictness = ConversionStrictness.Failed;
                return(unchecked ((Int32)lval));
            }

            // explicit conversion

            /*IPhpConvertible conv;
             * if ((conv = obj as IPhpConvertible) != null)
             * {
             *      int ival;
             *      double dval;
             *      long lval;
             *
             *      Convert.NumberInfo info = conv.ToNumber(out ival, out lval, out dval);
             *      if ((info & (Convert.NumberInfo.Integer | Convert.NumberInfo.IsNumber)) ==
             *              (Convert.NumberInfo.Integer | Convert.NumberInfo.IsNumber))
             *      {
             *              strictness = ConversionStrictness.Explicit;
             *              return ival;
             *      }
             *
             *      strictness = ConversionStrictness.Failed;
             *      return unchecked((Int32)lval);
             * }*/

            strictness = ConversionStrictness.Failed;
            return(0);
        }