1 #Region "Microsoft.VisualBasic::d9fd50be9a2c1b03365d0763699f16d9, Microsoft.VisualBasic.Core\Extensions\Math\Percentage.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Structure Percentage
35     
36     '         Properties: Denominator, FractionExpr, Numerator, One, Value
37     '                     ZERO
38     
39     '         Constructor: (+1 OverloadsSub New
40     '         Function: (+2 Overloads) CompareTo, Equals, GetTypeCode, ToBoolean, ToByte
41     '                   ToChar, ToDateTime, ToDecimal, ToDouble, ToInt16
42     '                   ToInt32, ToInt64, ToSByte, ToSingle, (+3 OverloadsToString
43     '                   ToType, ToUInt16, ToUInt32, ToUInt64, TryParse
44     '         Operators: <, >
45     
46     
47     ' /********************************************************************************/
48
49 #End Region
50
51 Imports System.Runtime.CompilerServices
52 Imports System.Text.RegularExpressions
53 Imports System.Xml.Serialization
54 Imports Microsoft.VisualBasic.Scripting.Runtime
55
56 Namespace Math
57
58     ''' <summary>
59     ''' 分数,百分比
60     ''' </summary>
61     ''' <remarks></remarks>
62     Public Structure Percentage : Implements IComparable, IFormattable, IConvertible, IComparable(Of [Double]), IEquatable(Of [Double])
63
64         ''' <summary>
65         ''' 分子
66         ''' </summary>
67         ''' <remarks></remarks>
68         <XmlAttribute> Public Property Numerator As Double
69         ''' <summary>
70         ''' 分母
71         ''' </summary>
72         ''' <remarks></remarks>
73         <XmlAttribute> Public Property Denominator As Double
74
75         ''' <summary>
76         ''' <see cref="Numerator"></see>/<see cref="Denominator"></see>
77         ''' </summary>
78         ''' <value></value>
79         ''' <returns></returns>
80         ''' <remarks></remarks>
81         <SoapIgnore> Public ReadOnly Property Value As Double
82             <MethodImpl(MethodImplOptions.AggressiveInlining)>
83             Get
84                 If Numerator = 0R Then
85                     Return 0
86                 Else
87                     Return Numerator / Denominator
88                 End If
89             End Get
90         End Property
91
92         <SoapIgnore> Public ReadOnly Property FractionExpr As String
93             <MethodImpl(MethodImplOptions.AggressiveInlining)>
94             Get
95                 Return $"{Numerator}/{Denominator}"
96             End Get
97         End Property
98
99         ''' <summary>
100         ''' <paramref name="n"/> / <paramref name="d"/>
101         ''' </summary>
102         ''' <param name="n"></param>
103         ''' <param name="d"></param>
104         Sub New(n As Double, d As Double)
105             Numerator = n
106             Denominator = d
107         End Sub
108
109         Public Overrides Function ToString() As String
110             Return String.Format("{0}/{1} ({2}%)", Numerator, Denominator, Value)
111         End Function
112
113         ''' <summary>
114         ''' 
115         ''' </summary>
116         ''' <param name="Text">``\d+[/]\d+ \(\d+[%]\)``</param>
117         ''' <returns></returns>
118         ''' <remarks></remarks>
119         Public Shared Function TryParse(Text As StringAs Percentage
120             If String.IsNullOrEmpty(Text) Then Return ZERO
121
122             Dim matchs$() = Regex.Matches(Text, "\d+").ToArray
123             Dim n As Double = matchs(0).RegexParseDouble
124             Dim d As Double = matchs(1).RegexParseDouble
125
126             Return New Percentage With {
127                 .Numerator = n,
128                 .Denominator = d
129             }
130         End Function
131
132         Public Shared ReadOnly Property ZERO As New Percentage(0, 1)
133         Public Shared ReadOnly Property OnAs New Percentage(1, 1)
134
135         <MethodImpl(MethodImplOptions.AggressiveInlining)>
136         Public Shared Narrowing Operator CType(value As Percentage) As Double
137             Return value.Value
138         End Operator
139
140         <MethodImpl(MethodImplOptions.AggressiveInlining)>
141         Public Shared Operator >(value As Percentage, n As DoubleAs Boolean
142             Return value.Value > n
143         End Operator
144
145         <MethodImpl(MethodImplOptions.AggressiveInlining)>
146         Public Shared Operator <(value As Percentage, n As DoubleAs Boolean
147             Return value.Value < n
148         End Operator
149
150 #Region "Public Interface"
151         Public Function CompareTo(obj As ObjectAs Integer Implements IComparable.CompareTo
152             If obj Is Nothing Then
153                 Return 1
154             End If
155             If obj.GetType Is GetType(Double) Then
156                 Return Value.CompareTo(DirectCast(obj, Double))
157             ElseIf obj.GetType Is GetType(Percentage) Then
158                 Return Value.CompareTo(DirectCast(obj, Percentage).Value)
159             Else
160                 Return 1
161             End If
162         End Function
163
164         <MethodImpl(MethodImplOptions.AggressiveInlining)>
165         Public Overloads Function ToString(format As String, formatProvider As IFormatProvider) As String Implements IFormattable.ToString
166             Return Value.ToString(format, formatProvider)
167         End Function
168
169 #Region "Implements IConvertible"
170         <MethodImpl(MethodImplOptions.AggressiveInlining)>
171         Public Function GetTypeCode() As TypeCode Implements IConvertible.GetTypeCode
172             Return TypeCode.Double
173         End Function
174
175         Private Function ToBoolean(provider As IFormatProvider) As Boolean Implements IConvertible.ToBoolean
176             Throw New NotImplementedException()
177         End Function
178
179         Private Function ToChar(provider As IFormatProvider) As Char Implements IConvertible.ToChar
180             Throw New NotImplementedException()
181         End Function
182
183         Private Function ToSByte(provider As IFormatProvider) As SByte Implements IConvertible.ToSByte
184             Throw New NotImplementedException()
185         End Function
186
187         Private Function ToByte(provider As IFormatProvider) As Byte Implements IConvertible.ToByte
188             Throw New NotImplementedException()
189         End Function
190
191         Private Function ToInt16(provider As IFormatProvider) As Short Implements IConvertible.ToInt16
192             Throw New NotImplementedException()
193         End Function
194
195         Private Function ToUInt16(provider As IFormatProvider) As UShort Implements IConvertible.ToUInt16
196             Throw New NotImplementedException()
197         End Function
198
199         Private Function ToInt32(provider As IFormatProvider) As Integer Implements IConvertible.ToInt32
200             Throw New NotImplementedException()
201         End Function
202
203         Private Function ToUInt32(provider As IFormatProvider) As UInteger Implements IConvertible.ToUInt32
204             Throw New NotImplementedException()
205         End Function
206
207         Private Function ToInt64(provider As IFormatProvider) As Long Implements IConvertible.ToInt64
208             Throw New NotImplementedException()
209         End Function
210
211         Private Function ToUInt64(provider As IFormatProvider) As ULong Implements IConvertible.ToUInt64
212             Throw New NotImplementedException()
213         End Function
214
215         Private Function ToSingle(provider As IFormatProvider) As Single Implements IConvertible.ToSingle
216             Throw New NotImplementedException()
217         End Function
218
219         Private Function ToDouble(provider As IFormatProvider) As Double Implements IConvertible.ToDouble
220             Throw New NotImplementedException()
221         End Function
222
223         Private Function ToDecimal(provider As IFormatProvider) As Decimal Implements IConvertible.ToDecimal
224             Throw New NotImplementedException()
225         End Function
226
227         Private Function ToDateTime(provider As IFormatProvider) As Date Implements IConvertible.ToDateTime
228             Throw New NotImplementedException()
229         End Function
230
231         <MethodImpl(MethodImplOptions.AggressiveInlining)>
232         Public Overloads Function ToString(provider As IFormatProvider) As String Implements IConvertible.ToString
233             Return Value.ToString(provider)
234         End Function
235
236         Private Function ToType(conversionType As Type, provider As IFormatProvider) As Object Implements IConvertible.ToType
237             Throw New NotImplementedException()
238         End Function
239 #End Region
240
241         <MethodImpl(MethodImplOptions.AggressiveInlining)>
242         Public Function CompareTo(other As DoubleAs Integer Implements IComparable(Of Double).CompareTo
243             Return Value.CompareTo(other)
244         End Function
245
246         <MethodImpl(MethodImplOptions.AggressiveInlining)>
247         Public Overloads Function Equals(other As DoubleAs Boolean Implements IEquatable(Of Double).Equals
248             Return Value.Equals(other)
249         End Function
250 #End Region
251     End Structure
252 End Namespace