From 12a91687629a147ee3442e9a184eb632e74e6e18 Mon Sep 17 00:00:00 2001 From: Florian Bernd Date: Tue, 11 Jul 2023 16:00:35 +0200 Subject: [PATCH] Fix localization issue with floating-point deserialization from string (#7811) --- .../Core/Fields/FieldValue.cs | 42 ++++++------------- .../DoubleWithFractionalPortionConverter.cs | 4 +- .../FloatWithFractionalPortionConverter.cs | 4 +- 3 files changed, 16 insertions(+), 34 deletions(-) diff --git a/src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs b/src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs index 276516d1c60..1d3172f5313 100644 --- a/src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs +++ b/src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs @@ -7,6 +7,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Collections.Generic; +using System.Globalization; using Elastic.Clients.Elasticsearch.Serialization; namespace Elastic.Clients.Elasticsearch; @@ -246,37 +247,18 @@ internal bool TryGetComposite([NotNullWhen(returnValue: true)] out object? value return true; } - public override string ToString() - { - if (Kind == ValueKind.String) - { - return Value as string; - } - else if (Kind == ValueKind.Double) - { - return ((double)Value).ToString(); - } - else if (Kind == ValueKind.Long) - { - return ((long)Value).ToString(); - } - else if (Kind == ValueKind.Boolean) - { - return ((bool)Value).ToString(); - } - else if (Kind == ValueKind.Null) - { - return "null"; - } - else if (Kind == ValueKind.LazyDocument || Kind == ValueKind.Composite) - { - throw new InvalidOperationException("Composite field value cannot be formatted as a string."); - } - else + public override string ToString() => + Kind switch { - throw new InvalidOperationException($"Unknown kind '{Kind}'"); - } - } + ValueKind.Null => "null", + ValueKind.Double => ((double)Value).ToString(CultureInfo.InvariantCulture), + ValueKind.Long => ((long)Value).ToString(CultureInfo.InvariantCulture), + ValueKind.Boolean => ((bool)Value).ToString(CultureInfo.InvariantCulture), + ValueKind.String => Value as string, + ValueKind.LazyDocument or ValueKind.Composite => throw new InvalidOperationException( + "Composite field value cannot be formatted as a string."), + _ => throw new InvalidOperationException($"Unknown kind '{Kind}'") + }; public override bool Equals(object? obj) => obj is FieldValue value && Equals(value); public bool Equals(FieldValue other) => Kind == other.Kind && EqualityComparer.Default.Equals(Value, other.Value); diff --git a/src/Elastic.Clients.Elasticsearch/Serialization/DoubleWithFractionalPortionConverter.cs b/src/Elastic.Clients.Elasticsearch/Serialization/DoubleWithFractionalPortionConverter.cs index 27d6a622aa3..e5e48375c6d 100644 --- a/src/Elastic.Clients.Elasticsearch/Serialization/DoubleWithFractionalPortionConverter.cs +++ b/src/Elastic.Clients.Elasticsearch/Serialization/DoubleWithFractionalPortionConverter.cs @@ -25,7 +25,7 @@ public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS { var value = reader.GetString(); - if (!double.TryParse(value, out var parsedValue)) + if (!double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue)) ThrowHelper.ThrowJsonException($"Unable to parse '{value}' as a double."); return parsedValue; @@ -67,7 +67,7 @@ public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOp var utf16Text = value.ToString("G17", CultureInfo.InvariantCulture); if (utf16Text.Length < utf8bytes.Length) - { + { try { var bytes = Encoding.UTF8.GetBytes(utf16Text); diff --git a/src/Elastic.Clients.Elasticsearch/Serialization/FloatWithFractionalPortionConverter.cs b/src/Elastic.Clients.Elasticsearch/Serialization/FloatWithFractionalPortionConverter.cs index f9532091ae4..23ba2b5eaa4 100644 --- a/src/Elastic.Clients.Elasticsearch/Serialization/FloatWithFractionalPortionConverter.cs +++ b/src/Elastic.Clients.Elasticsearch/Serialization/FloatWithFractionalPortionConverter.cs @@ -25,7 +25,7 @@ public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSe { var value = reader.GetString(); - if (!float.TryParse(value, out var parsedValue)) + if (!float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue)) ThrowHelper.ThrowJsonException($"Unable to parse '{value}' as a float."); return parsedValue; @@ -67,7 +67,7 @@ public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOpt var utf16Text = value.ToString("G9", CultureInfo.InvariantCulture); if (utf16Text.Length < utf8bytes.Length) - { + { try { var bytes = Encoding.UTF8.GetBytes(utf16Text);