Skip to content

Commit bc495cb

Browse files
Fix localization issue with floating-point deserialization from string (#7811) (#7821)
Co-authored-by: Florian Bernd <[email protected]>
1 parent 35346ee commit bc495cb

File tree

3 files changed

+16
-34
lines changed

3 files changed

+16
-34
lines changed

src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs

+12-30
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System;
88
using System.Diagnostics.CodeAnalysis;
99
using System.Collections.Generic;
10+
using System.Globalization;
1011
using Elastic.Clients.Elasticsearch.Serialization;
1112

1213
namespace Elastic.Clients.Elasticsearch;
@@ -246,37 +247,18 @@ internal bool TryGetComposite([NotNullWhen(returnValue: true)] out object? value
246247
return true;
247248
}
248249

249-
public override string ToString()
250-
{
251-
if (Kind == ValueKind.String)
252-
{
253-
return Value as string;
254-
}
255-
else if (Kind == ValueKind.Double)
256-
{
257-
return ((double)Value).ToString();
258-
}
259-
else if (Kind == ValueKind.Long)
260-
{
261-
return ((long)Value).ToString();
262-
}
263-
else if (Kind == ValueKind.Boolean)
264-
{
265-
return ((bool)Value).ToString();
266-
}
267-
else if (Kind == ValueKind.Null)
268-
{
269-
return "null";
270-
}
271-
else if (Kind == ValueKind.LazyDocument || Kind == ValueKind.Composite)
272-
{
273-
throw new InvalidOperationException("Composite field value cannot be formatted as a string.");
274-
}
275-
else
250+
public override string ToString() =>
251+
Kind switch
276252
{
277-
throw new InvalidOperationException($"Unknown kind '{Kind}'");
278-
}
279-
}
253+
ValueKind.Null => "null",
254+
ValueKind.Double => ((double)Value).ToString(CultureInfo.InvariantCulture),
255+
ValueKind.Long => ((long)Value).ToString(CultureInfo.InvariantCulture),
256+
ValueKind.Boolean => ((bool)Value).ToString(CultureInfo.InvariantCulture),
257+
ValueKind.String => Value as string,
258+
ValueKind.LazyDocument or ValueKind.Composite => throw new InvalidOperationException(
259+
"Composite field value cannot be formatted as a string."),
260+
_ => throw new InvalidOperationException($"Unknown kind '{Kind}'")
261+
};
280262

281263
public override bool Equals(object? obj) => obj is FieldValue value && Equals(value);
282264
public bool Equals(FieldValue other) => Kind == other.Kind && EqualityComparer<object?>.Default.Equals(Value, other.Value);

src/Elastic.Clients.Elasticsearch/Serialization/DoubleWithFractionalPortionConverter.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
2525
{
2626
var value = reader.GetString();
2727

28-
if (!double.TryParse(value, out var parsedValue))
28+
if (!double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue))
2929
ThrowHelper.ThrowJsonException($"Unable to parse '{value}' as a double.");
3030

3131
return parsedValue;
@@ -67,7 +67,7 @@ public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOp
6767
var utf16Text = value.ToString("G17", CultureInfo.InvariantCulture);
6868

6969
if (utf16Text.Length < utf8bytes.Length)
70-
{
70+
{
7171
try
7272
{
7373
var bytes = Encoding.UTF8.GetBytes(utf16Text);

src/Elastic.Clients.Elasticsearch/Serialization/FloatWithFractionalPortionConverter.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSe
2525
{
2626
var value = reader.GetString();
2727

28-
if (!float.TryParse(value, out var parsedValue))
28+
if (!float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue))
2929
ThrowHelper.ThrowJsonException($"Unable to parse '{value}' as a float.");
3030

3131
return parsedValue;
@@ -67,7 +67,7 @@ public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOpt
6767
var utf16Text = value.ToString("G9", CultureInfo.InvariantCulture);
6868

6969
if (utf16Text.Length < utf8bytes.Length)
70-
{
70+
{
7171
try
7272
{
7373
var bytes = Encoding.UTF8.GetBytes(utf16Text);

0 commit comments

Comments
 (0)