using System; using System.ComponentModel; using System.Drawing; using System.Globalization; namespace Dongke.WinForm.Controls { /// /// 数值精度 /// [TypeConverter(typeof(DNumberConverter))] [Serializable] public struct DNumber { #region 成员变量 /// /// 整数位精度 /// private int _x; /// /// 小数位精度 /// private int _y; #endregion #region 属性 /// /// 整数位精度 /// public int X { get { return this._x; } set { if (value > 0) { this._x = value; } else { this._x = 0; } } } /// /// 小数位精度 /// public int Y { get { return this._y; } set { if (value > 0) { this._y = value; } else { this._y = 0; } } } #endregion #region 构造 /// /// 数值精度 /// /// 整数位数 /// 小数位数 public DNumber(int x, int y) { if (x > 0) { this._x = x; } else { this._x = 0; } if (y > 0) { this._y = y; } else { this._y = 0; } } #endregion #region 公有方法 /// /// 测试此 DNumber 结构的整数位和小数位精度是否为 0。 /// [Browsable(false)] public bool IsEmpty { get { return this._x == 0 && this._y == 0; } } /// /// 指示此实例与指定对象是否相等。 /// /// 要比较的另一个对象 /// 如果 obj 和该实例具有相同的类型并表示相同的值,则为 true;否则为 false。 public override bool Equals(object obj) { if ((obj is DNumber)) { DNumber n = (DNumber)obj; return n.X == this._x && n.Y == this._y; } return false; } /// /// 返回此实例的哈希代码。 /// /// 一个 32 位有符号整数,它是该实例的哈希代码。 public override int GetHashCode() { return this._x ^ this._y; } /// /// 最大数值 /// /// public decimal ToDecimal() { if (!this.IsEmpty) { string dec = null; if (this._x > 0) { dec = string.Empty.PadLeft(this._x, '9'); } else { dec = "0"; } if (this._y > 0) { dec += ".".PadRight(this._y + 1, '9'); } return Convert.ToDecimal(dec); } return 0; } public static decimal ToDecimal(Point p) { if (!p.IsEmpty) { string dec = null; if (p.X > 0) { dec = string.Empty.PadLeft(p.X, '9'); } else { dec = "0"; } if (p.Y > 0) { dec += ".".PadRight(p.Y + 1, '9'); } return Convert.ToDecimal(dec); } return 0; } #endregion #region 重写方法 /// /// 返回当前对象的字符串形式 /// /// public override string ToString() { return string.Concat("{X=", this.X.ToString(CultureInfo.CurrentCulture), ",Y=", this.Y.ToString(CultureInfo.CurrentCulture), "}"); } #endregion #region 静态方法 /// /// DNumber.X 和 DNumber.Y 值为 0 的 DNumber。 /// public static readonly DNumber Empty = new DNumber(); /// /// 比较两个 DNumber 对象。此结果指定两个 DNumber 对象的 DNumber.X 或 DNumber.Y 属性的值是否不等。 /// /// 要比较的 DNumber /// 要比较的 DNumber /// 如果 left 和 right 的 DNumber.X 属性值或 DNumber.Y 属性值不等,则为true;否则为 false public static bool operator !=(DNumber left, DNumber right) { return (left.X != right.X || left.Y != right.Y); } /// /// 比较两个 DNumber 对象。此结果指定两个 DNumber 对象的 DNumber.X 或 DNumber.Y 属性的值是否相等。 /// /// 要比较的 DNumber /// 要比较的 DNumber /// 如果 left 和 right 的 DNumber.X 属性值或 DNumber.Y 属性值不等,则为true;否则为 false public static bool operator ==(DNumber left, DNumber right) { return (left.X == right.X && left.Y == right.Y); } #endregion } }