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