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); }
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); }
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); }