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