diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/CustomFormatStrings.cs b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/CustomFormatStrings.cs
index 0b78e057a9..dca24743c3 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/CustomFormatStrings.cs
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/CustomFormatStrings.cs
@@ -8,4 +8,7 @@ public static class CustomFormatStrings
public static string DigitSeparator(double number) => number.ToString("#,###.00");
public static string Phone(long value) => string.Format("{0:(###) ###-####}", value);
public static string PhoneInterpolated(long value) => $"{value:(###) ###-####}";
+ public static string Accounting(double number) => number.ToString("#,##0.00;(#,##0.00);Zero");
+ public static string BlankZero(double number) => number.ToString("0;;''");
+ public static string EmptyThirdSection(double number) => number.ToString("#,##0.00;(#,##0.00);");
}
\ No newline at end of file
diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings.csproj b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings.csproj
index 2150e3797b..ed9781c223 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings.csproj
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings.csproj
@@ -2,7 +2,7 @@
Exe
- net8.0
+ net10.0
enable
enable
diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatsStrings.cs b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatStrings.cs
similarity index 60%
rename from strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatsStrings.cs
rename to strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatStrings.cs
index fa9ee6811f..4c1a38b9ef 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatsStrings.cs
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStrings/StandardFormatStrings.cs
@@ -11,4 +11,10 @@ public static class StandardFormatStrings
public static string DecimalPrecision(int value) => value.ToString("D5");
public static string FloatingPointPrecision(double value) => value.ToString("F2");
public static string Percentage(double value) => $"{value:P2}";
+ public static string FixedPointPrecisionDecimal(decimal value) => value.ToString("F2");
+ public static string Aligned(double value) => string.Format("{0,12:N2}", value);
+ public static string AlignedInterpolated(double value) => $"{value,-12:N2}";
+
+ public static bool TryFormatFixedPoint(double value, Span destination, out int charsWritten) =>
+ value.TryFormat(destination, out charsWritten, "F2", CultureInfo.InvariantCulture);
}
\ No newline at end of file
diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/CustomFormatStringsTests.cs b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/CustomFormatStringsTests.cs
index a672cf105a..20b27ceb38 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/CustomFormatStringsTests.cs
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/CustomFormatStringsTests.cs
@@ -1,4 +1,4 @@
-namespace StandardAndCustomNumericFormatStringsTests;
+namespace StandardAndCustomFormatStringsTests;
public class CustomFormatStringsTests
{
@@ -56,4 +56,35 @@ public void GivenANumber_WhenPhoneInterpolated_ReturnsFormattedPhoneNumber(long
Assert.Equal(expected, result);
}
-}
\ No newline at end of file
+
+ [Theory]
+ [InlineData(1234.5, "1,234.50")]
+ [InlineData(-1234.5, "(1,234.50)")]
+ [InlineData(0.0, "Zero")]
+ public void GivenAValue_WhenAccounting_ThenTheSectionMatchingTheSignIsUsed(double input, string expected)
+ {
+ string result = CustomFormatStrings.Accounting(input);
+
+ Assert.Equal(expected, result);
+ }
+
+ [Theory]
+ [InlineData(1234.5, "1235")]
+ [InlineData(-1234.5, "-1235")]
+ [InlineData(0.0, "")]
+ public void GivenAValue_WhenBlankZero_ThenZeroFormatsAsAnEmptyString(double input, string expected)
+ {
+ string result = CustomFormatStrings.BlankZero(input);
+
+ Assert.Equal(expected, result);
+ }
+
+ [Theory]
+ [InlineData(0.0, "0.00")]
+ public void GivenZero_WhenTheThirdSectionIsEmpty_ThenItIsIgnoredAndTheFirstSectionIsUsed(double input, string expected)
+ {
+ string result = CustomFormatStrings.EmptyThirdSection(input);
+
+ Assert.Equal(expected, result);
+ }
+}
diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardAndCustomFormatStringsTests.csproj b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardAndCustomFormatStringsTests.csproj
index 23191912ae..57db3479bf 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardAndCustomFormatStringsTests.csproj
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardAndCustomFormatStringsTests.csproj
@@ -1,7 +1,7 @@
- net8.0
+ net10.0
enable
enable
@@ -10,13 +10,13 @@
-
-
-
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatsStringsTests.cs b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatStringsTests.cs
similarity index 50%
rename from strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatsStringsTests.cs
rename to strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatStringsTests.cs
index 7878c12502..b312e6d1a2 100644
--- a/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatsStringsTests.cs
+++ b/strings-csharp/StandardAndCustomFormatStrings/StandardAndCustomFormatStringsTests/StandardFormatStringsTests.cs
@@ -64,4 +64,62 @@ public void GivenANumber_WhenPercentage_ReturnsPercentage(double input, string e
Assert.Contains(expected, result);
}
-}
\ No newline at end of file
+
+ [Theory]
+ [InlineData(1.005, "1.00")]
+ [InlineData(0.125, "0.12")]
+ public void GivenAnApparentMidpoint_WhenFloatingPointPrecision_ThenTheStoredBinaryValueDecides(double input, string expected)
+ {
+ string result = StandardFormatStrings.FloatingPointPrecision(input);
+
+ Assert.Equal(expected, result);
+ }
+
+ [Fact]
+ public void GivenAMidpoint_WhenFixedPointPrecisionDecimal_ThenItRoundsAwayFromZero()
+ {
+ Assert.Equal("1.01", StandardFormatStrings.FixedPointPrecisionDecimal(1.005m));
+ Assert.Equal("0.13", StandardFormatStrings.FixedPointPrecisionDecimal(0.125m));
+ }
+
+ [Theory]
+ [InlineData(1652.5899, " 1,652.59")]
+ public void GivenAValue_WhenAligned_ThenItIsRightAlignedInATwelveCharacterField(double input, string expected)
+ {
+ string result = StandardFormatStrings.Aligned(input);
+
+ Assert.Equal(expected, result);
+ }
+
+ [Theory]
+ [InlineData(1652.5899, "1,652.59 ")]
+ public void GivenAValue_WhenAlignedInterpolated_ThenANegativeWidthLeftAlignsIt(double input, string expected)
+ {
+ string result = StandardFormatStrings.AlignedInterpolated(input);
+
+ Assert.Equal(expected, result);
+ }
+
+ [Fact]
+ public void GivenABigEnoughBuffer_WhenTryFormatFixedPoint_ThenItWritesTheValueAndReturnsTrue()
+ {
+ Span buffer = stackalloc char[16];
+
+ bool succeeded = StandardFormatStrings.TryFormatFixedPoint(1652.5899, buffer, out int charsWritten);
+
+ Assert.True(succeeded);
+ Assert.Equal(7, charsWritten);
+ Assert.Equal("1652.59", buffer[..charsWritten].ToString());
+ }
+
+ [Fact]
+ public void GivenATooSmallBuffer_WhenTryFormatFixedPoint_ThenItWritesNothingAndReturnsFalse()
+ {
+ Span buffer = stackalloc char[2];
+
+ bool succeeded = StandardFormatStrings.TryFormatFixedPoint(1652.5899, buffer, out int charsWritten);
+
+ Assert.False(succeeded);
+ Assert.Equal(0, charsWritten);
+ }
+}