30
30
// ReSharper disable once CheckNamespace
31
31
namespace UnitsNet
32
32
{
33
- internal delegate TUnitType ParseUnitDelegate < out TUnitType > ( string unitString , IFormatProvider formatProvider ) where TUnitType : Enum ;
34
- internal delegate bool TryParseUnitDelegate < TUnitType > ( string unitString , IFormatProvider formatProvider , out TUnitType unit ) where TUnitType : Enum ;
35
33
36
34
#if ! WINDOWS_UWP
37
35
internal delegate TQuantity QuantityFromDelegate < out TQuantity , in TUnitType > ( QuantityValue value , TUnitType fromUnit )
@@ -51,12 +49,14 @@ internal class QuantityParser
51
49
private const NumberStyles ParseNumberStyles = NumberStyles . Number | NumberStyles . Float | NumberStyles . AllowExponent ;
52
50
53
51
private readonly UnitAbbreviationsCache _unitAbbreviationsCache ;
52
+ private UnitParser _unitParser ;
54
53
55
54
public static QuantityParser Default { get ; }
56
55
57
56
public QuantityParser ( UnitAbbreviationsCache unitAbbreviationsCache )
58
57
{
59
58
_unitAbbreviationsCache = unitAbbreviationsCache ?? UnitAbbreviationsCache . Default ;
59
+ _unitParser = new UnitParser ( _unitAbbreviationsCache ) ;
60
60
}
61
61
62
62
static QuantityParser ( )
@@ -67,13 +67,11 @@ static QuantityParser()
67
67
[ SuppressMessage ( "ReSharper" , "UseStringInterpolation" ) ]
68
68
internal TQuantity Parse < TQuantity , TUnitType > ( [ NotNull ] string str ,
69
69
[ CanBeNull ] IFormatProvider formatProvider ,
70
- [ NotNull ] ParseUnitDelegate < TUnitType > parseUnit ,
71
70
[ NotNull ] QuantityFromDelegate < TQuantity , TUnitType > fromDelegate )
72
71
where TQuantity : IQuantity
73
72
where TUnitType : Enum
74
73
{
75
74
if ( str == null ) throw new ArgumentNullException ( nameof ( str ) ) ;
76
- if ( parseUnit == null ) throw new ArgumentNullException ( nameof ( parseUnit ) ) ;
77
75
78
76
var numFormat = formatProvider != null
79
77
? ( NumberFormatInfo ) formatProvider . GetFormat ( typeof ( NumberFormatInfo ) )
@@ -91,13 +89,12 @@ internal TQuantity Parse<TQuantity, TUnitType>([NotNull] string str,
91
89
throw ex ;
92
90
}
93
91
94
- return ParseWithRegex ( valueString , unitString , parseUnit , fromDelegate , formatProvider ) ;
92
+ return ParseWithRegex ( valueString , unitString , fromDelegate , formatProvider ) ;
95
93
}
96
94
97
95
[ SuppressMessage ( "ReSharper" , "UseStringInterpolation" ) ]
98
96
internal bool TryParse < TQuantity , TUnitType > ( [ NotNull ] string str ,
99
97
[ CanBeNull ] IFormatProvider formatProvider ,
100
- [ NotNull ] TryParseUnitDelegate < TUnitType > parseUnit ,
101
98
[ NotNull ] QuantityFromDelegate < TQuantity , TUnitType > fromDelegate ,
102
99
out TQuantity result )
103
100
where TQuantity : IQuantity
@@ -119,7 +116,7 @@ internal bool TryParse<TQuantity, TUnitType>([NotNull] string str,
119
116
if ( ! ExtractValueAndUnit ( regex , str , out var valueString , out var unitString ) )
120
117
return false ;
121
118
122
- return TryParseWithRegex ( valueString , unitString , parseUnit , fromDelegate , formatProvider , out result ) ;
119
+ return TryParseWithRegex ( valueString , unitString , fromDelegate , formatProvider , out result ) ;
123
120
}
124
121
125
122
internal string CreateRegexPatternForUnit < TUnitType > (
@@ -148,26 +145,24 @@ private static string GetRegexPatternForUnitAbbreviations(IEnumerable<string> ab
148
145
/// Parse a string given a particular regular expression.
149
146
/// </summary>
150
147
/// <exception cref="UnitsNetException">Error parsing string.</exception>
151
- private static TQuantity ParseWithRegex < TQuantity , TUnitType > ( string valueString ,
148
+ private TQuantity ParseWithRegex < TQuantity , TUnitType > ( string valueString ,
152
149
string unitString ,
153
- ParseUnitDelegate < TUnitType > parseUnit ,
154
150
QuantityFromDelegate < TQuantity , TUnitType > fromDelegate ,
155
151
IFormatProvider formatProvider )
156
152
where TQuantity : IQuantity
157
153
where TUnitType : Enum
158
154
{
159
155
var value = double . Parse ( valueString , ParseNumberStyles , formatProvider ) ;
160
- var parsedUnit = parseUnit ( unitString , formatProvider ) ;
156
+ var parsedUnit = _unitParser . Parse < TUnitType > ( unitString , formatProvider ) ;
161
157
return fromDelegate ( value , parsedUnit ) ;
162
158
}
163
159
164
160
/// <summary>
165
161
/// Parse a string given a particular regular expression.
166
162
/// </summary>
167
163
/// <exception cref="UnitsNetException">Error parsing string.</exception>
168
- private static bool TryParseWithRegex < TQuantity , TUnitType > ( string valueString ,
164
+ private bool TryParseWithRegex < TQuantity , TUnitType > ( string valueString ,
169
165
string unitString ,
170
- TryParseUnitDelegate < TUnitType > tryParseUnit ,
171
166
QuantityFromDelegate < TQuantity , TUnitType > fromDelegate ,
172
167
IFormatProvider formatProvider ,
173
168
out TQuantity result )
@@ -177,10 +172,10 @@ private static bool TryParseWithRegex<TQuantity, TUnitType>(string valueString,
177
172
result = default ;
178
173
179
174
if ( ! double . TryParse ( valueString , ParseNumberStyles , formatProvider , out var value ) )
180
- return false ;
175
+ return false ;
181
176
182
- if ( ! tryParseUnit ( unitString , formatProvider , out var parsedUnit ) )
183
- return false ;
177
+ if ( ! _unitParser . TryParse < TUnitType > ( unitString , formatProvider , out var parsedUnit ) )
178
+ return false ;
184
179
185
180
result = fromDelegate ( value , parsedUnit ) ;
186
181
return true ;
0 commit comments