Skip to content

Commit 1592710

Browse files
committed
replace decimal.Parse with double.Parse to include support for parsing values exceeding range of decimal
1 parent ac02124 commit 1592710

File tree

13 files changed

+40
-35
lines changed

13 files changed

+40
-35
lines changed

src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) Microsoft Corporation. All rights reserved.
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

44
using System;
@@ -57,7 +57,7 @@ internal static partial class OpenApiV2Deserializer
5757
{
5858
"maximum", (o, n) =>
5959
{
60-
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
60+
GetOrCreateSchema(o).Maximum = double.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
6161
}
6262
},
6363
{
@@ -69,7 +69,7 @@ internal static partial class OpenApiV2Deserializer
6969
{
7070
"minimum", (o, n) =>
7171
{
72-
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
72+
GetOrCreateSchema(o).Minimum = double.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
7373
}
7474
},
7575
{
@@ -117,7 +117,7 @@ internal static partial class OpenApiV2Deserializer
117117
{
118118
"multipleOf", (o, n) =>
119119
{
120-
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
120+
GetOrCreateSchema(o).MultipleOf = double.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
121121
}
122122
},
123123
{

src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,13 @@ internal static partial class OpenApiV2Deserializer
8282
{
8383
"minimum", (o, n) =>
8484
{
85-
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
85+
GetOrCreateSchema(o).Minimum = double.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
8686
}
8787
},
8888
{
8989
"maximum", (o, n) =>
9090
{
91-
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
91+
GetOrCreateSchema(o).Maximum = double.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
9292
}
9393
},
9494
{

src/Microsoft.OpenApi.Readers/V2/OpenApiSchemaDeserializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ internal static partial class OpenApiV2Deserializer
2626
{
2727
"multipleOf", (o, n) =>
2828
{
29-
o.MultipleOf = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
29+
o.MultipleOf = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
3030
}
3131
},
3232
{
3333
"maximum", (o, n) =>
3434
{
35-
o.Maximum = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
35+
o.Maximum = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
3636
}
3737
},
3838
{
@@ -44,7 +44,7 @@ internal static partial class OpenApiV2Deserializer
4444
{
4545
"minimum", (o, n) =>
4646
{
47-
o.Minimum = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
47+
o.Minimum = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
4848
}
4949
},
5050
{

src/Microsoft.OpenApi.Readers/V3/OpenApiSchemaDeserializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ internal static partial class OpenApiV3Deserializer
2727
{
2828
"multipleOf", (o, n) =>
2929
{
30-
o.MultipleOf = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
30+
o.MultipleOf = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
3131
}
3232
},
3333
{
3434
"maximum", (o, n) =>
3535
{
36-
o.Maximum = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
36+
o.Maximum = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
3737
}
3838
},
3939
{
@@ -45,7 +45,7 @@ internal static partial class OpenApiV3Deserializer
4545
{
4646
"minimum", (o, n) =>
4747
{
48-
o.Minimum = decimal.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
48+
o.Minimum = double.Parse(n.GetScalarValue(), NumberStyles.Float, CultureInfo.InvariantCulture);
4949
}
5050
},
5151
{

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class OpenApiSchema : IOpenApiSerializable, IOpenApiReferenceable, IEffec
4141
/// <summary>
4242
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
4343
/// </summary>
44-
public decimal? Maximum { get; set; }
44+
public double? Maximum { get; set; }
4545

4646
/// <summary>
4747
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
@@ -51,7 +51,7 @@ public class OpenApiSchema : IOpenApiSerializable, IOpenApiReferenceable, IEffec
5151
/// <summary>
5252
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
5353
/// </summary>
54-
public decimal? Minimum { get; set; }
54+
public double? Minimum { get; set; }
5555

5656
/// <summary>
5757
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
@@ -77,7 +77,7 @@ public class OpenApiSchema : IOpenApiSerializable, IOpenApiReferenceable, IEffec
7777
/// <summary>
7878
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
7979
/// </summary>
80-
public decimal? MultipleOf { get; set; }
80+
public double? MultipleOf { get; set; }
8181

8282
/// <summary>
8383
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00

src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ public interface IOpenApiWriter
3939
void WriteValue(string value);
4040

4141
/// <summary>
42-
/// Write the decimal value.
42+
/// Write the double value.
4343
/// </summary>
44-
void WriteValue(decimal value);
44+
void WriteValue(double value);
4545

4646
/// <summary>
4747
/// Write the int value.

src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,11 @@ public virtual void WriteValue(double value)
148148
}
149149

150150
/// <summary>
151-
/// Write decimal value.
151+
/// Write
152+
///
153+
/// value.
152154
/// </summary>
153-
/// <param name="value">The decimal value.</param>
155+
/// <param name="value">The double value.</param>
154156
public virtual void WriteValue(decimal value)
155157
{
156158
WriteValueSeparator();

src/Microsoft.OpenApi/Writers/SpecialCharacterStringExtensions.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,12 @@ internal static string GetYamlCompatibleString(this string input)
187187
return $"'{input}'";
188188
}
189189

190-
// If string can be mistaken as a number, c-style hexadecimal notation, a boolean, or a timestamp,
191-
// wrap it in quote to indicate that this is indeed a string, not a number, c-style hexadecimal notation, a boolean, or a timestamp
192-
if (decimal.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out var _) ||
193-
IsHexadecimalNotation(input) ||
190+
// If string can be mistaken as a number, c-style hexa
191+
//
192+
// notation, a boolean, or a timestamp,
193+
// wrap it in quote to indicate that this is indeed a string, not a number, c-style hexadouble notation, a boolean, or a timestamp
194+
if (double.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out var _) ||
195+
IsHexadoubleNotation(input) ||
194196
bool.TryParse(input, out var _) ||
195197
DateTime.TryParse(input, CultureInfo.InvariantCulture, DateTimeStyles.None, out var _))
196198
{
@@ -227,7 +229,7 @@ internal static string GetJsonCompatibleString(this string value)
227229
return $"\"{value}\"";
228230
}
229231

230-
internal static bool IsHexadecimalNotation(string input)
232+
internal static bool IsHexadoubleNotation(string input)
231233
{
232234
return input.StartsWith("0x") && int.TryParse(input.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var _);
233235
}

test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ public void ParseDocumentWithDifferentCultureShouldSucceed(string culture)
134134
["sampleProperty"] = new OpenApiSchema()
135135
{
136136
Type = "double",
137-
Minimum = (decimal)100.54,
138-
Maximum = (decimal)60000000.35,
137+
Minimum = (double)100.54,
138+
Maximum = (double)60000000.35,
139139
ExclusiveMaximum = true,
140140
ExclusiveMinimum = false
141141
}

test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ public void ParseDocumentWithDifferentCultureShouldSucceed(string culture)
157157
["sampleProperty"] = new OpenApiSchema()
158158
{
159159
Type = "double",
160-
Minimum = (decimal)100.54,
161-
Maximum = (decimal)60000000.35,
160+
Minimum = (double)100.54,
161+
Maximum = (double)60000000.35,
162162
ExclusiveMaximum = true,
163163
ExclusiveMinimum = false
164164
}

0 commit comments

Comments
 (0)