diff --git a/specs/Qowaiv.Specs/Financial/Amount_specs.cs b/specs/Qowaiv.Specs/Financial/Amount_specs.cs index fbc2e75b..330c7ffe 100644 --- a/specs/Qowaiv.Specs/Financial/Amount_specs.cs +++ b/specs/Qowaiv.Specs/Financial/Amount_specs.cs @@ -88,6 +88,20 @@ public class Supports_JSON_serialization public void System_Text_JSON_deserialization(object json, Amount svo) => JsonTester.Read_System_Text_JSON(json).Should().Be(svo); + [Test] + public void System_Text_JSON_deserialization_min_value() + { + var amount = System.Text.Json.JsonSerializer.Deserialize("-7.922816251426434E+28"); + amount.Should().Be(Amount.MinValue); + } + + [Test] + public void System_Text_JSON_deserialization_max_value() + { + var amount = System.Text.Json.JsonSerializer.Deserialize("7.922816251426434E+28"); + amount.Should().Be(Amount.MaxValue); + } + [TestCase(1234.56, 1234.56)] public void System_Text_JSON_serialization(Amount svo, object json) => JsonTester.Write_System_Text_JSON(svo).Should().Be(json); diff --git a/src/Qowaiv/Cast.cs b/src/Qowaiv/Cast.cs index 6be9d8f5..86ac5d9b 100644 --- a/src/Qowaiv/Cast.cs +++ b/src/Qowaiv/Cast.cs @@ -12,6 +12,12 @@ /// Helper class to facilitate on SVO casting. internal static class Cast { + private static class Dbl + { + public const double DecimalMin = (double)decimal.MinValue; + public const double DecimalMax = (double)decimal.MaxValue; + } + /// Casts from a primitive (not ) to a SVO. [Pure] public static TSvo Primitive(TryCreate tryCreate, TPrimitive? value) @@ -39,9 +45,17 @@ public static TSvo InvariantString(TryParseInvariant tryParse, strin public static decimal ToDecimal(double value) => double.IsNaN(value) || double.IsInfinity(value) - || !value.IsInRange((double)decimal.MinValue, (double)decimal.MaxValue) + || !value.IsInRange(Dbl.DecimalMin, Dbl.DecimalMax) ? throw Exceptions.InvalidCast() - : (decimal)value; + : ToDecimal(value); + + [Pure] + private static decimal ToDecimal(double value) + { + if (value >= Dbl.DecimalMax) return decimal.MaxValue; + if (value <= Dbl.DecimalMin) return decimal.MinValue; + return (decimal)value; + } /// Casts a to for the SVO. [Pure] diff --git a/src/Qowaiv/Qowaiv.csproj b/src/Qowaiv/Qowaiv.csproj index c766c8f4..1ff0b111 100644 --- a/src/Qowaiv/Qowaiv.csproj +++ b/src/Qowaiv/Qowaiv.csproj @@ -5,9 +5,11 @@ netstandard2.0;net5.0;net6.0;net7.0;net8.0 true - 6.6.1 + 6.6.2 Qowaiv +v6.6.2 +- JSON-deserialization from decimal.MaxValue (as double) should not fail. #380 (fix) v6.6.1 - Add missing IParsable interface for Id. #372 v6.6.0