From 19d73bd17009fecff74216673afb43fc83ef6005 Mon Sep 17 00:00:00 2001 From: gmipf Date: Thu, 15 Oct 2026 17:14:53 +0200 Subject: [PATCH] Parse doubles with the invariant culture in ConvertToDouble (#5) * Parse doubles with the invariant culture ConvertToDouble used double.TryParse with the current culture, so a value like "59.940000" became 59940000 on a German system and null on a French one. Co-Authored-By: Claude Opus 5.5 * Drop the culture reset from the ConvertToDouble test A culture set inside a test does not carry over to the next test, so the reset and the try/finally around it are not needed. Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- SabreTools.Text.Extensions.Test/NumberHelperTests.cs | 12 ++++++++++++ SabreTools.Text.Extensions/NumberHelper.cs | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/SabreTools.Text.Extensions.Test/NumberHelperTests.cs b/SabreTools.Text.Extensions.Test/NumberHelperTests.cs index 74f3b72..a1b97bc 100644 --- a/SabreTools.Text.Extensions.Test/NumberHelperTests.cs +++ b/SabreTools.Text.Extensions.Test/NumberHelperTests.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using Xunit; namespace SabreTools.Text.Extensions.Test @@ -31,6 +32,17 @@ namespace SabreTools.Text.Extensions.Test Assert.True(variance < 0.1f); } + [Theory] + [InlineData("en-US")] + [InlineData("de-DE")] + [InlineData("fr-FR")] + public void ConvertToDoubleTest_CurrentCultureIgnored(string culture) + { + CultureInfo.CurrentCulture = new CultureInfo(culture); + double? actual = NumberHelper.ConvertToDouble("59.940000"); + Assert.Equal(59.94, actual); + } + #endregion #region ConvertToInt64 diff --git a/SabreTools.Text.Extensions/NumberHelper.cs b/SabreTools.Text.Extensions/NumberHelper.cs index 6f69741..a3742cf 100644 --- a/SabreTools.Text.Extensions/NumberHelper.cs +++ b/SabreTools.Text.Extensions/NumberHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; namespace SabreTools.Text.Extensions { @@ -47,7 +48,7 @@ namespace SabreTools.Text.Extensions if (string.IsNullOrEmpty(numeric)) return null; - if (!double.TryParse(numeric, out double doubleValue)) + if (!double.TryParse(numeric, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out double doubleValue)) return null; return doubleValue;