1 #Region "Microsoft.VisualBasic::ee195b74a28dcb160af735f26a4debfe, Microsoft.VisualBasic.Core\Extensions\StringHelpers\Parser.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     Module PrimitiveParser
35     
36     '     Properties: BooleanValues
37     
38     '     FunctionIsNumeric, (+2 Overloads) ParseBoolean, ParseDate, ParseDouble, ParseInteger
39     '               ParseLong, ParseSingle
40     
41     ' /********************************************************************************/
42
43 #End Region
44
45 Imports System.Runtime.CompilerServices
46 Imports Microsoft.VisualBasic.CommandLine.Reflection
47 Imports Microsoft.VisualBasic.Language
48 Imports Microsoft.VisualBasic.Scripting.Runtime
49 Imports Microsoft.VisualBasic.Text
50 Imports r = System.Text.RegularExpressions.Regex
51
52 ''' <summary>
53 ''' Simple type parser extension function for <see cref="String"/>
54 ''' </summary>
55 Public Module PrimitiveParser
56
57     Public Function Eval(expression$, default#) As Double
58         If expression Is Nothing Then
59             Return [default]
60         Else
61             Return Conversion.Val(expression)
62         End If
63     End Function
64
65     ''' <summary>
66     ''' 用于匹配任意实数的正则表达式
67     ''' </summary>
68     Public Const NumericPattern$ = "[-]?\d*(\.\d+)?([eE][-]?\d*)?"
69
70     ''' <summary>
71     ''' Is this token value string is a number?
72     ''' </summary>
73     ''' <param name="str"></param>
74     ''' <returns></returns>
75     <ExportAPI("IsNumeric"Info:="Is this token value string is a number?")>
76     <Extension> Public Function IsNumeric(str$) As Boolean
77         With str.GetString(ASCII.Quot)
78             Dim s$ = r.Match(.ByRef, NumericPattern).Value
79             Return .ByRef = s
80         End With
81     End Function
82
83     ''' <summary>
84     ''' <see cref="Integer"/> text parser
85     ''' </summary>
86     ''' <param name="s"></param>
87     ''' <returns></returns>
88     ''' 
89     <MethodImpl(MethodImplOptions.AggressiveInlining)>
90     <Extension>
91     Public Function ParseInteger(s As StringAs Integer
92         Return CInt(Val(Trim(s)))
93     End Function
94
95     ''' <summary>
96     ''' <see cref="Long"/> text parser
97     ''' </summary>
98     ''' <param name="s"></param>
99     ''' <returns></returns>
100     ''' 
101     <MethodImpl(MethodImplOptions.AggressiveInlining)>
102     <Extension>
103     Public Function ParseLong(s As StringAs Long
104         Return CLng(Val(Trim(s)))
105     End Function
106
107     ''' <summary>
108     ''' <see cref="Double"/> text parser
109     ''' </summary>
110     ''' <param name="s"></param>
111     ''' <returns></returns>
112     ''' 
113     <MethodImpl(MethodImplOptions.AggressiveInlining)>
114     <Extension>
115     Public Function ParseDouble(s As StringAs Double
116         If s Is Nothing Then
117             Return 0
118         Else
119             Return ParseNumeric(s)
120         End If
121     End Function
122
123     ''' <summary>
124     ''' <see cref="Single"/> text parser
125     ''' </summary>
126     ''' <param name="s"></param>
127     ''' <returns></returns>
128     ''' 
129     <MethodImpl(MethodImplOptions.AggressiveInlining)>
130     <Extension>
131     Public Function ParseSingle(s As StringAs Single
132         Return CSng(Val(Trim(s)))
133     End Function
134
135     ''' <summary>
136     ''' <see cref="Date"/> text parser
137     ''' </summary>
138     ''' <param name="s"></param>
139     ''' <returns></returns>
140     ''' 
141     <MethodImpl(MethodImplOptions.AggressiveInlining)>
142     <Extension>
143     Public Function ParseDate(s As StringAs Date
144         Return Date.Parse(Trim(s))
145     End Function
146
147     ''' <summary>
148     ''' Convert the string value into the boolean value, this is useful to the text format configuration file into data model.
149     ''' </summary>
150     ''' <returns></returns>
151     Public ReadOnly Property BooleanValues As New SortedDictionary(Of StringBoolean) From {
152  _
153             {"t"True}, {"true"True},
154             {"1"True},
155             {"y"True}, {"yes"True}, {"ok"True},
156             {"ok!"True},
157             {"success"True}, {"successful"True}, {"successfully"True}, {"succeeded"True},
158             {"right"True},
159             {"wrong"False},
160             {"failure"False}, {"failures"False},
161             {"exception"False},
162             {"error"False}, {"err"False},
163             {"f"False}, {"false"False},
164             {"0"False},
165             {"n"False}, {"no"False}
166         }
167
168     ''' <summary>
169     ''' Convert the string value into the boolean value, this is useful to the text format configuration file into data model.
170     ''' (请注意,空值字符串为False,如果字符串不存在与单词表之中,则也是False)
171     ''' </summary>
172     ''' <param name="str"></param>
173     ''' <returns></returns>
174     ''' <remarks></remarks>
175     <ExportAPI("Get.Boolean")> <Extension> Public Function ParseBoolean(str$) As Boolean
176         If String.IsNullOrEmpty(str) Then
177             Return False
178         Else
179             str = str.ToLower.Trim
180         End If
181
182         If BooleanValues.ContainsKey(key:=str) Then
183             Return BooleanValues(str)
184         Else
185 #If DEBUG Then
186             Call $"""{str}"" {NameOf([Boolean])} (null_value_definition)  ==> False".__DEBUG_ECHO
187 #End If
188             Return False
189         End If
190     End Function
191
192     <Extension> <ExportAPI("Get.Boolean")> Public Function ParseBoolean(ch As CharAs Boolean
193         If ch = ASCII.NUL Then
194             Return False
195         End If
196
197         Select Case ch
198             Case "y"c, "Y"c, "t"c, "T"c, "1"c
199                 Return True
200             Case "n"c, "N"c, "f"c, "F"c, "0"c
201                 Return False
202         End Select
203
204         Return True
205     End Function
206 End Module