diff --git a/docs/input/docs/reference/custom-formatting.md b/docs/input/docs/reference/custom-formatting.md index c970fea342..a4bae75162 100644 --- a/docs/input/docs/reference/custom-formatting.md +++ b/docs/input/docs/reference/custom-formatting.md @@ -32,6 +32,7 @@ assembly-informational-format: "{Major}.{Minor}.{Patch:F2}-{PreReleaseLabel}" - `C` or `c` (Currency): `{Major:C}` → `"¤1.00"` - `P` or `p` (Percent): `{CommitsSinceVersionSource:P}` → `"12,345.60 %"` - `D` or `d` (Decimal): `{Major:D4}` → `"0001"` +- `B` or `b` (Binary): `{Minor:B4}` → `"0101"` - `X` or `x` (Hexadecimal): `{Patch:X}` → `"FF"` ### Date and Time Formatting diff --git a/src/GitVersion.Core.Tests/Formatting/NumericFormatterTests.cs b/src/GitVersion.Core.Tests/Formatting/NumericFormatterTests.cs index 9b466ead53..e3cecaba18 100644 --- a/src/GitVersion.Core.Tests/Formatting/NumericFormatterTests.cs +++ b/src/GitVersion.Core.Tests/Formatting/NumericFormatterTests.cs @@ -1,4 +1,4 @@ -using GitVersion.Formatting; +using GitVersion.Formatting; namespace GitVersion.Tests.Formatting; @@ -21,6 +21,9 @@ public void TryFormat_NullValue_ReturnsFalse() [TestCase("1234.5678", "f2", "1234.57")] [TestCase("1234.5678", "f0", "1235")] [TestCase("1234.5678", "g", "1234.5678")] + [TestCase("1234", "d8", "00001234")] + [TestCase("1234", "x8", "000004d2")] + [TestCase("12", "b8", "00001100")] public void TryFormat_ValidFormats_ReturnsExpectedResult(string input, string format, string expected) { var sut = new NumericFormatter(); diff --git a/src/GitVersion.Core/Formatting/NumericFormatter.cs b/src/GitVersion.Core/Formatting/NumericFormatter.cs index 14b1f791a3..bb5a296ccc 100644 --- a/src/GitVersion.Core/Formatting/NumericFormatter.cs +++ b/src/GitVersion.Core/Formatting/NumericFormatter.cs @@ -14,30 +14,30 @@ public override bool TryFormat(object? value, string format, CultureInfo culture return false; // Integer formatting - if (format.All(char.IsDigit) && int.TryParse(s, NumberStyles.Integer, cultureInfo, out var i)) + if (format.All(char.IsDigit) && int.TryParse(s, NumberStyles.Integer, cultureInfo, out var integerValue)) { - result = i.ToString(format, cultureInfo); + result = integerValue.ToString(format, cultureInfo); return true; } - // Hexadecimal formatting - if (format.StartsWith("X", StringComparison.OrdinalIgnoreCase) && int.TryParse(s, NumberStyles.Integer, cultureInfo, out var hex)) + // Integer formatting with precision specifier + if ("BDX".Contains(char.ToUpperInvariant(format[0])) && int.TryParse(s, NumberStyles.Integer, cultureInfo, out var numericValue)) { - result = hex.ToString(format, cultureInfo); + result = numericValue.ToString(format, cultureInfo); return true; } // Floating point formatting - if ("FEGNCP".Contains(char.ToUpperInvariant(format[0])) && double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, cultureInfo, out var d)) + if ("FEGNCP".Contains(char.ToUpperInvariant(format[0])) && double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, cultureInfo, out var floatValue)) { - result = d.ToString(format, cultureInfo); + result = floatValue.ToString(format, cultureInfo); return true; } // Decimal formatting - if (decimal.TryParse(s, NumberStyles.Any, cultureInfo, out var dec)) + if (decimal.TryParse(s, NumberStyles.Any, cultureInfo, out var decimalValue)) { - result = dec.ToString(format, cultureInfo); + result = decimalValue.ToString(format, cultureInfo); return true; }