diff --git a/PowerKit.Tests/BoolExtensionsTests.cs b/PowerKit.Tests/BoolExtensionsTests.cs
index 6424e67..c4e3a64 100644
--- a/PowerKit.Tests/BoolExtensionsTests.cs
+++ b/PowerKit.Tests/BoolExtensionsTests.cs
@@ -15,4 +15,15 @@ public void ParseOrNull_Test()
bool.ParseOrNull("yes").Should().BeNull();
bool.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ bool.ParseOrDefault("true").Should().BeTrue();
+ bool.ParseOrDefault("false").Should().BeFalse();
+ bool.ParseOrDefault("yes").Should().BeFalse();
+ bool.ParseOrDefault("yes", true).Should().BeTrue();
+ bool.ParseOrDefault(null).Should().BeFalse();
+ }
}
diff --git a/PowerKit.Tests/DateTimeExtensionsTests.cs b/PowerKit.Tests/DateTimeExtensionsTests.cs
index cd2f242..887e5e6 100644
--- a/PowerKit.Tests/DateTimeExtensionsTests.cs
+++ b/PowerKit.Tests/DateTimeExtensionsTests.cs
@@ -15,4 +15,17 @@ public void ParseOrNull_Test()
DateTime.ParseOrNull("not a date").Should().BeNull();
DateTime.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ DateTime.ParseOrDefault("2024-06-15").Should().Be(new DateTime(2024, 6, 15));
+ DateTime.ParseOrDefault("not a date").Should().Be(default(DateTime));
+ DateTime
+ .ParseOrDefault("not a date", new DateTime(2000, 1, 1))
+ .Should()
+ .Be(new DateTime(2000, 1, 1));
+ DateTime.ParseOrDefault(null).Should().Be(default(DateTime));
+ }
}
diff --git a/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs b/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs
index 383ed04..d61d38e 100644
--- a/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs
+++ b/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs
@@ -18,4 +18,20 @@ public void ParseOrNull_Test()
DateTimeOffset.ParseOrNull("not a date").Should().BeNull();
DateTimeOffset.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ DateTimeOffset
+ .ParseOrDefault("2024-06-15T00:00:00+00:00")
+ .Should()
+ .Be(new DateTimeOffset(2024, 6, 15, 0, 0, 0, TimeSpan.Zero));
+ DateTimeOffset.ParseOrDefault("not a date").Should().Be(default(DateTimeOffset));
+ DateTimeOffset
+ .ParseOrDefault("not a date", new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero))
+ .Should()
+ .Be(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero));
+ DateTimeOffset.ParseOrDefault(null).Should().Be(default(DateTimeOffset));
+ }
}
diff --git a/PowerKit.Tests/DecimalExtensionsTests.cs b/PowerKit.Tests/DecimalExtensionsTests.cs
index e586012..3b4710d 100644
--- a/PowerKit.Tests/DecimalExtensionsTests.cs
+++ b/PowerKit.Tests/DecimalExtensionsTests.cs
@@ -15,4 +15,15 @@ public void ParseOrNull_Test()
decimal.ParseOrNull("abc").Should().BeNull();
decimal.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ decimal.ParseOrDefault("3.14").Should().Be(3.14m);
+ decimal.ParseOrDefault("-1.5").Should().Be(-1.5m);
+ decimal.ParseOrDefault("abc").Should().Be(0m);
+ decimal.ParseOrDefault("abc", -1m).Should().Be(-1m);
+ decimal.ParseOrDefault(null).Should().Be(0m);
+ }
}
diff --git a/PowerKit.Tests/DoubleExtensionsTests.cs b/PowerKit.Tests/DoubleExtensionsTests.cs
index 12c69d5..56a75a1 100644
--- a/PowerKit.Tests/DoubleExtensionsTests.cs
+++ b/PowerKit.Tests/DoubleExtensionsTests.cs
@@ -15,4 +15,15 @@ public void ParseOrNull_Test()
double.ParseOrNull("abc").Should().BeNull();
double.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ double.ParseOrDefault("3.14").Should().Be(3.14);
+ double.ParseOrDefault("-1.5").Should().Be(-1.5);
+ double.ParseOrDefault("abc").Should().Be(0.0);
+ double.ParseOrDefault("abc", -1.0).Should().Be(-1.0);
+ double.ParseOrDefault(null).Should().Be(0.0);
+ }
}
diff --git a/PowerKit.Tests/GuidExtensionsTests.cs b/PowerKit.Tests/GuidExtensionsTests.cs
index db6978b..d427c7d 100644
--- a/PowerKit.Tests/GuidExtensionsTests.cs
+++ b/PowerKit.Tests/GuidExtensionsTests.cs
@@ -17,4 +17,18 @@ public void ParseOrNull_Test()
Guid.ParseOrNull("not-a-guid").Should().BeNull();
Guid.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ Guid.ParseOrDefault("12345678-1234-1234-1234-123456789abc")
+ .Should()
+ .Be(new Guid("12345678-1234-1234-1234-123456789abc"));
+ Guid.ParseOrDefault("not-a-guid").Should().Be(Guid.Empty);
+ Guid.ParseOrDefault("not-a-guid", new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff"))
+ .Should()
+ .Be(new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff"));
+ Guid.ParseOrDefault(null).Should().Be(Guid.Empty);
+ }
}
diff --git a/PowerKit.Tests/IntExtensionsTests.cs b/PowerKit.Tests/IntExtensionsTests.cs
index 95d04ac..722c8e8 100644
--- a/PowerKit.Tests/IntExtensionsTests.cs
+++ b/PowerKit.Tests/IntExtensionsTests.cs
@@ -15,4 +15,15 @@ public void ParseOrNull_Test()
int.ParseOrNull("abc").Should().BeNull();
int.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ int.ParseOrDefault("42").Should().Be(42);
+ int.ParseOrDefault("-7").Should().Be(-7);
+ int.ParseOrDefault("abc").Should().Be(0);
+ int.ParseOrDefault("abc", -1).Should().Be(-1);
+ int.ParseOrDefault(null).Should().Be(0);
+ }
}
diff --git a/PowerKit.Tests/LongExtensionsTests.cs b/PowerKit.Tests/LongExtensionsTests.cs
index 46b08e1..d36a9ff 100644
--- a/PowerKit.Tests/LongExtensionsTests.cs
+++ b/PowerKit.Tests/LongExtensionsTests.cs
@@ -15,4 +15,15 @@ public void ParseOrNull_Test()
long.ParseOrNull("abc").Should().BeNull();
long.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ long.ParseOrDefault("9876543210").Should().Be(9876543210L);
+ long.ParseOrDefault("-1").Should().Be(-1L);
+ long.ParseOrDefault("abc").Should().Be(0L);
+ long.ParseOrDefault("abc", -1L).Should().Be(-1L);
+ long.ParseOrDefault(null).Should().Be(0L);
+ }
}
diff --git a/PowerKit.Tests/TimeSpanExtensionsTests.cs b/PowerKit.Tests/TimeSpanExtensionsTests.cs
index 3bc5e6d..f54fb59 100644
--- a/PowerKit.Tests/TimeSpanExtensionsTests.cs
+++ b/PowerKit.Tests/TimeSpanExtensionsTests.cs
@@ -15,4 +15,17 @@ public void ParseOrNull_Test()
TimeSpan.ParseOrNull("not a timespan").Should().BeNull();
TimeSpan.ParseOrNull(null).Should().BeNull();
}
+
+ [Fact]
+ public void ParseOrDefault_Test()
+ {
+ // Act & assert
+ TimeSpan.ParseOrDefault("1:30:00").Should().Be(new TimeSpan(1, 30, 0));
+ TimeSpan.ParseOrDefault("not a timespan").Should().Be(TimeSpan.Zero);
+ TimeSpan
+ .ParseOrDefault("not a timespan", TimeSpan.FromSeconds(5))
+ .Should()
+ .Be(TimeSpan.FromSeconds(5));
+ TimeSpan.ParseOrDefault(null).Should().Be(TimeSpan.Zero);
+ }
}
diff --git a/PowerKit/Extensions/BoolExtensions.cs b/PowerKit/Extensions/BoolExtensions.cs
index ed76d1f..f70e36d 100644
--- a/PowerKit/Extensions/BoolExtensions.cs
+++ b/PowerKit/Extensions/BoolExtensions.cs
@@ -15,5 +15,11 @@ internal static class BoolExtensions
///
public static bool? ParseOrNull(string? str) =>
bool.TryParse(str, out var result) ? result : null;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static bool ParseOrDefault(string? str, bool defaultValue = default) =>
+ bool.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/DateTimeExtensions.cs b/PowerKit/Extensions/DateTimeExtensions.cs
index 6cc7f33..c5354c5 100644
--- a/PowerKit/Extensions/DateTimeExtensions.cs
+++ b/PowerKit/Extensions/DateTimeExtensions.cs
@@ -27,5 +27,22 @@ DateTimeStyles styles
///
public static DateTime? ParseOrNull(string? str) =>
DateTime.ParseOrNull(str, CultureInfo.CurrentCulture, DateTimeStyles.None);
+
+ ///
+ /// Parses the string as a using the specified format provider and styles,
+ /// returning if parsing fails.
+ ///
+ public static DateTime ParseOrDefault(
+ string? str,
+ IFormatProvider? formatProvider,
+ DateTimeStyles styles,
+ DateTime defaultValue = default
+ ) => DateTime.ParseOrNull(str, formatProvider, styles) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static DateTime ParseOrDefault(string? str, DateTime defaultValue = default) =>
+ DateTime.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/DateTimeOffsetExtensions.cs b/PowerKit/Extensions/DateTimeOffsetExtensions.cs
index 6cdeeb2..78e19d7 100644
--- a/PowerKit/Extensions/DateTimeOffsetExtensions.cs
+++ b/PowerKit/Extensions/DateTimeOffsetExtensions.cs
@@ -27,5 +27,24 @@ DateTimeStyles styles
///
public static DateTimeOffset? ParseOrNull(string? str) =>
DateTimeOffset.ParseOrNull(str, CultureInfo.CurrentCulture, DateTimeStyles.None);
+
+ ///
+ /// Parses the string as a using the specified format provider and styles,
+ /// returning if parsing fails.
+ ///
+ public static DateTimeOffset ParseOrDefault(
+ string? str,
+ IFormatProvider? formatProvider,
+ DateTimeStyles styles,
+ DateTimeOffset defaultValue = default
+ ) => DateTimeOffset.ParseOrNull(str, formatProvider, styles) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static DateTimeOffset ParseOrDefault(
+ string? str,
+ DateTimeOffset defaultValue = default
+ ) => DateTimeOffset.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/DecimalExtensions.cs b/PowerKit/Extensions/DecimalExtensions.cs
index 5d973ae..524c797 100644
--- a/PowerKit/Extensions/DecimalExtensions.cs
+++ b/PowerKit/Extensions/DecimalExtensions.cs
@@ -27,5 +27,22 @@ internal static class DecimalExtensions
///
public static decimal? ParseOrNull(string? str) =>
decimal.ParseOrNull(str, NumberStyles.Number, CultureInfo.CurrentCulture);
+
+ ///
+ /// Parses the string as a using the specified styles and format provider,
+ /// returning if parsing fails.
+ ///
+ public static decimal ParseOrDefault(
+ string? str,
+ NumberStyles styles,
+ IFormatProvider? formatProvider,
+ decimal defaultValue = default
+ ) => decimal.ParseOrNull(str, styles, formatProvider) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static decimal ParseOrDefault(string? str, decimal defaultValue = default) =>
+ decimal.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/DoubleExtensions.cs b/PowerKit/Extensions/DoubleExtensions.cs
index c4fcac5..d9b33ae 100644
--- a/PowerKit/Extensions/DoubleExtensions.cs
+++ b/PowerKit/Extensions/DoubleExtensions.cs
@@ -31,5 +31,22 @@ internal static class DoubleExtensions
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.CurrentCulture
);
+
+ ///
+ /// Parses the string as a using the specified styles and format provider,
+ /// returning if parsing fails.
+ ///
+ public static double ParseOrDefault(
+ string? str,
+ NumberStyles styles,
+ IFormatProvider? formatProvider,
+ double defaultValue = default
+ ) => double.ParseOrNull(str, styles, formatProvider) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static double ParseOrDefault(string? str, double defaultValue = default) =>
+ double.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/GuidExtensions.cs b/PowerKit/Extensions/GuidExtensions.cs
index 53dfa74..247c27e 100644
--- a/PowerKit/Extensions/GuidExtensions.cs
+++ b/PowerKit/Extensions/GuidExtensions.cs
@@ -16,5 +16,11 @@ internal static class GuidExtensions
///
public static Guid? ParseOrNull(string? str) =>
Guid.TryParse(str, out var result) ? result : null;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static Guid ParseOrDefault(string? str, Guid defaultValue = default) =>
+ Guid.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/IntExtensions.cs b/PowerKit/Extensions/IntExtensions.cs
index 445fd43..8e7e8ca 100644
--- a/PowerKit/Extensions/IntExtensions.cs
+++ b/PowerKit/Extensions/IntExtensions.cs
@@ -27,5 +27,22 @@ internal static class IntExtensions
///
public static int? ParseOrNull(string? str) =>
int.ParseOrNull(str, NumberStyles.Integer, CultureInfo.CurrentCulture);
+
+ ///
+ /// Parses the string as an using the specified styles and format provider,
+ /// returning if parsing fails.
+ ///
+ public static int ParseOrDefault(
+ string? str,
+ NumberStyles styles,
+ IFormatProvider? formatProvider,
+ int defaultValue = default
+ ) => int.ParseOrNull(str, styles, formatProvider) ?? defaultValue;
+
+ ///
+ /// Parses the string as an , returning if parsing fails.
+ ///
+ public static int ParseOrDefault(string? str, int defaultValue = default) =>
+ int.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/LongExtensions.cs b/PowerKit/Extensions/LongExtensions.cs
index 6353138..343e717 100644
--- a/PowerKit/Extensions/LongExtensions.cs
+++ b/PowerKit/Extensions/LongExtensions.cs
@@ -27,5 +27,22 @@ internal static class LongExtensions
///
public static long? ParseOrNull(string? str) =>
long.ParseOrNull(str, NumberStyles.Integer, CultureInfo.CurrentCulture);
+
+ ///
+ /// Parses the string as a using the specified styles and format provider,
+ /// returning if parsing fails.
+ ///
+ public static long ParseOrDefault(
+ string? str,
+ NumberStyles styles,
+ IFormatProvider? formatProvider,
+ long defaultValue = default
+ ) => long.ParseOrNull(str, styles, formatProvider) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static long ParseOrDefault(string? str, long defaultValue = default) =>
+ long.ParseOrNull(str) ?? defaultValue;
}
}
diff --git a/PowerKit/Extensions/TimeSpanExtensions.cs b/PowerKit/Extensions/TimeSpanExtensions.cs
index f4da8e2..d0ce30a 100644
--- a/PowerKit/Extensions/TimeSpanExtensions.cs
+++ b/PowerKit/Extensions/TimeSpanExtensions.cs
@@ -24,5 +24,21 @@ internal static class TimeSpanExtensions
///
public static TimeSpan? ParseOrNull(string? str) =>
TimeSpan.ParseOrNull(str, CultureInfo.CurrentCulture);
+
+ ///
+ /// Parses the string as a using the specified format provider,
+ /// returning if parsing fails.
+ ///
+ public static TimeSpan ParseOrDefault(
+ string? str,
+ IFormatProvider? formatProvider,
+ TimeSpan defaultValue = default
+ ) => TimeSpan.ParseOrNull(str, formatProvider) ?? defaultValue;
+
+ ///
+ /// Parses the string as a , returning if parsing fails.
+ ///
+ public static TimeSpan ParseOrDefault(string? str, TimeSpan defaultValue = default) =>
+ TimeSpan.ParseOrNull(str) ?? defaultValue;
}
}