DNumber.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. 
  2. using System;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Globalization;
  6. namespace Dongke.WinForm.Controls
  7. {
  8. /// <summary>
  9. /// 数值精度
  10. /// </summary>
  11. [TypeConverter(typeof(DNumberConverter))]
  12. [Serializable]
  13. public struct DNumber
  14. {
  15. #region 成员变量
  16. /// <summary>
  17. /// 整数位精度
  18. /// </summary>
  19. private int _x;
  20. /// <summary>
  21. /// 小数位精度
  22. /// </summary>
  23. private int _y;
  24. #endregion
  25. #region 属性
  26. /// <summary>
  27. /// 整数位精度
  28. /// </summary>
  29. public int X
  30. {
  31. get
  32. {
  33. return this._x;
  34. }
  35. set
  36. {
  37. if (value > 0)
  38. {
  39. this._x = value;
  40. }
  41. else
  42. {
  43. this._x = 0;
  44. }
  45. }
  46. }
  47. /// <summary>
  48. /// 小数位精度
  49. /// </summary>
  50. public int Y
  51. {
  52. get
  53. {
  54. return this._y;
  55. }
  56. set
  57. {
  58. if (value > 0)
  59. {
  60. this._y = value;
  61. }
  62. else
  63. {
  64. this._y = 0;
  65. }
  66. }
  67. }
  68. #endregion
  69. #region 构造
  70. /// <summary>
  71. /// 数值精度
  72. /// </summary>
  73. /// <param name="x">整数位数</param>
  74. /// <param name="y">小数位数</param>
  75. public DNumber(int x, int y)
  76. {
  77. if (x > 0)
  78. {
  79. this._x = x;
  80. }
  81. else
  82. {
  83. this._x = 0;
  84. }
  85. if (y > 0)
  86. {
  87. this._y = y;
  88. }
  89. else
  90. {
  91. this._y = 0;
  92. }
  93. }
  94. #endregion
  95. #region 公有方法
  96. /// <summary>
  97. /// 测试此 DNumber 结构的整数位和小数位精度是否为 0。
  98. /// </summary>
  99. [Browsable(false)]
  100. public bool IsEmpty
  101. {
  102. get
  103. {
  104. return this._x == 0 && this._y == 0;
  105. }
  106. }
  107. /// <summary>
  108. /// 指示此实例与指定对象是否相等。
  109. /// </summary>
  110. /// <param name="obj">要比较的另一个对象</param>
  111. /// <returns>如果 obj 和该实例具有相同的类型并表示相同的值,则为 true;否则为 false。</returns>
  112. public override bool Equals(object obj)
  113. {
  114. if ((obj is DNumber))
  115. {
  116. DNumber n = (DNumber)obj;
  117. return n.X == this._x && n.Y == this._y;
  118. }
  119. return false;
  120. }
  121. /// <summary>
  122. /// 返回此实例的哈希代码。
  123. /// </summary>
  124. /// <returns>一个 32 位有符号整数,它是该实例的哈希代码。</returns>
  125. public override int GetHashCode()
  126. {
  127. return this._x ^ this._y;
  128. }
  129. /// <summary>
  130. /// 最大数值
  131. /// </summary>
  132. /// <returns></returns>
  133. public decimal ToDecimal()
  134. {
  135. if (!this.IsEmpty)
  136. {
  137. string dec = null;
  138. if (this._x > 0)
  139. {
  140. dec = string.Empty.PadLeft(this._x, '9');
  141. }
  142. else
  143. {
  144. dec = "0";
  145. }
  146. if (this._y > 0)
  147. {
  148. dec += ".".PadRight(this._y + 1, '9');
  149. }
  150. return Convert.ToDecimal(dec);
  151. }
  152. return 0;
  153. }
  154. public static decimal ToDecimal(Point p)
  155. {
  156. if (!p.IsEmpty)
  157. {
  158. string dec = null;
  159. if (p.X > 0)
  160. {
  161. dec = string.Empty.PadLeft(p.X, '9');
  162. }
  163. else
  164. {
  165. dec = "0";
  166. }
  167. if (p.Y > 0)
  168. {
  169. dec += ".".PadRight(p.Y + 1, '9');
  170. }
  171. return Convert.ToDecimal(dec);
  172. }
  173. return 0;
  174. }
  175. #endregion
  176. #region 重写方法
  177. /// <summary>
  178. /// 返回当前对象的字符串形式
  179. /// </summary>
  180. /// <returns></returns>
  181. public override string ToString()
  182. {
  183. return string.Concat("{X=", this.X.ToString(CultureInfo.CurrentCulture),
  184. ",Y=", this.Y.ToString(CultureInfo.CurrentCulture), "}");
  185. }
  186. #endregion
  187. #region 静态方法
  188. /// <summary>
  189. /// DNumber.X 和 DNumber.Y 值为 0 的 DNumber。
  190. /// </summary>
  191. public static readonly DNumber Empty = new DNumber();
  192. /// <summary>
  193. /// 比较两个 DNumber 对象。此结果指定两个 DNumber 对象的 DNumber.X 或 DNumber.Y 属性的值是否不等。
  194. /// </summary>
  195. /// <param name="left">要比较的 DNumber</param>
  196. /// <param name="right">要比较的 DNumber</param>
  197. /// <returns>如果 left 和 right 的 DNumber.X 属性值或 DNumber.Y 属性值不等,则为true;否则为 false</returns>
  198. public static bool operator !=(DNumber left, DNumber right)
  199. {
  200. return (left.X != right.X || left.Y != right.Y);
  201. }
  202. /// <summary>
  203. /// 比较两个 DNumber 对象。此结果指定两个 DNumber 对象的 DNumber.X 或 DNumber.Y 属性的值是否相等。
  204. /// </summary>
  205. /// <param name="left">要比较的 DNumber</param>
  206. /// <param name="right">要比较的 DNumber</param>
  207. /// <returns>如果 left 和 right 的 DNumber.X 属性值或 DNumber.Y 属性值不等,则为true;否则为 false</returns>
  208. public static bool operator ==(DNumber left, DNumber right)
  209. {
  210. return (left.X == right.X && left.Y == right.Y);
  211. }
  212. #endregion
  213. }
  214. }