Wolfgang.Extensions.String
0.1.1
Prefix Reserved
dotnet add package Wolfgang.Extensions.String --version 0.1.1
NuGet\Install-Package Wolfgang.Extensions.String -Version 0.1.1
<PackageReference Include="Wolfgang.Extensions.String" Version="0.1.1" />
<PackageVersion Include="Wolfgang.Extensions.String" Version="0.1.1" />
<PackageReference Include="Wolfgang.Extensions.String" />
paket add Wolfgang.Extensions.String --version 0.1.1
#r "nuget: Wolfgang.Extensions.String, 0.1.1"
#:package Wolfgang.Extensions.String@0.1.1
#addin nuget:?package=Wolfgang.Extensions.String&version=0.1.1
#tool nuget:?package=Wolfgang.Extensions.String&version=0.1.1
Wolfgang.Extensions.String
A collection of extension methods for string — substring helpers (Left / Right), center-padding (PadCenter), and case conversions (ToCamelCase / ToKebabCase / ToPascalCase / ToSnakeCase / ToTitleCase).
📦 Installation
dotnet add package Wolfgang.Extensions.String
📄 License
This project is licensed under the MIT License. See the LICENSE file for details.
📚 Documentation
- GitHub Repository: https://github.com/Chris-Wolfgang/String-Extensions
- API Documentation: https://Chris-Wolfgang.github.io/String-Extensions/
- CHANGELOG: CHANGELOG.md
- Contributing Guide: CONTRIBUTING.md
- Formatting Guide: docs/README-FORMATTING.md
- Release Workflow Setup: docs/RELEASE-WORKFLOW-SETUP.md
- Workflow Security: docs/WORKFLOW_SECURITY.md
🚀 Quick Start
using System;
using Wolfgang.Extensions.String;
// Substring helpers (null-tolerant, length-clamped)
var path = "/usr/local/bin/app";
var first5 = path.Left(5); // "/usr/"
var last3 = path.Right(3); // "app"
// Centered formatting
Console.WriteLine($"{"Name".PadCenter(10)}|{"Date".PadCenter(12)}");
Console.WriteLine("----------+------------");
Console.WriteLine($"{"Steve",-10}|{"04/13/2026".PadCenter(12)}");
// Case conversions
var input = "user login count";
Console.WriteLine(input.ToCamelCase()); // "userLoginCount"
Console.WriteLine(input.ToKebabCase()); // "user-login-count"
Console.WriteLine(input.ToPascalCase()); // "UserLoginCount"
Console.WriteLine(input.ToSnakeCase()); // "user_login_count"
Console.WriteLine(input.ToTitleCase()); // "User Login Count"
✨ Features
The table below is a snapshot of the public API at the time of writing. For the authoritative list (kept in sync with source on every release), see the API documentation.
Methods
| Method | Returns | Description |
|---|---|---|
Left(this string, int length) |
string |
Returns the leftmost length characters. Returns the whole string when it is shorter than length; returns null for a null input. |
Right(this string, int length) |
string |
Returns the rightmost length characters. Returns the whole string when it is shorter than length; returns null for a null input. |
PadCenter(this string, int totalWidth) |
string |
Centers the string within totalWidth, padding both sides with spaces. When padding is uneven the extra character goes on the right. Returns the original string when it is already at least totalWidth long. |
PadCenter(this string, int totalWidth, char paddingChar) |
string |
As above, padding with paddingChar instead of spaces. |
ToCamelCase(this string) |
string |
Converts to camelCase. Separator characters are treated as word boundaries and removed. |
ToKebabCase(this string) |
string |
Converts to kebab-case. Separator characters become dashes. |
ToPascalCase(this string) |
string |
Converts to PascalCase. Separator characters are treated as word boundaries and removed. |
ToSnakeCase(this string) |
string |
Converts to snake_case. Separator characters become underscores. |
ToTitleCase(this string) |
string |
Converts to Title Case, preserving spaces and punctuation. Delegates to TextInfo.ToTitleCase using the current culture. |
Left / Right are length-clamping and null-tolerant. PadCenter and the ToXxxCase methods throw ArgumentNullException for a null input; PadCenter throws ArgumentOutOfRangeException for a negative width. Separator handling uses char.IsSeparator, so control characters and punctuation are preserved.
Examples
// Substring helpers
"A sample string".Left(8); // "A sample"
"Hello".Left(10); // "Hello" (shorter than requested → unchanged)
"Hello".Left(0); // ""
"A sample string".Right(6); // "string"
"Hello".Right(10); // "Hello"
"Hello".Right(0); // ""
// Center padding
"Hello".PadCenter(11); // " Hello "
"Hello".PadCenter(11, '-'); // "---Hello---"
"Hello".PadCenter(3); // "Hello" (already wide enough → unchanged)
// Case conversions
"A sample string for processing".ToCamelCase(); // "aSampleStringForProcessing"
"A sample string for processing".ToKebabCase(); // "a-sample-string-for-processing"
"A sample string for processing".ToPascalCase(); // "ASampleStringForProcessing"
"A sample string for processing".ToSnakeCase(); // "a_sample_string_for_processing"
"a sample string for processing".ToTitleCase(); // "A Sample String For Processing"
Note:
ToTitleCaseis a general-purpose implementation that delegates toTextInfo.ToTitleCase. Proper names, addresses, and other domain-specific text often require specialized handling (e.g., "McDonald", "van der Berg", "O'Brien") that is not provided here.
🎯 Target Frameworks
| Framework | Versions |
|---|---|
| .NET Framework | .NET Framework 4.6.2 |
| .NET Standard | .NET Standard 2.0 |
| .NET | .NET 8.0, .NET 10.0 |
🔍 Code Quality & Static Analysis
This project enforces strict code quality standards through 8 analyzer rule sets (7 explicit PackageReferences plus the .NET SDK's built-in Microsoft.CodeAnalysis.NetAnalyzers), a <TreatWarningsAsErrors>true</TreatWarningsAsErrors> Release gate, and a banned-API ruleset:
Analyzers in Use
- Microsoft.CodeAnalysis.NetAnalyzers — Built-in .NET analyzers for correctness and performance
- Roslynator.Analyzers — Advanced refactoring and code quality rules
- AsyncFixer — Async/await best practices and anti-pattern detection
- Microsoft.VisualStudio.Threading.Analyzers — Thread safety and async patterns
- Microsoft.CodeAnalysis.BannedApiAnalyzers — Prevents usage of banned synchronous APIs (see
BannedSymbols.txt) - Meziantou.Analyzer — Comprehensive code quality rules
- SonarAnalyzer.CSharp — Industry-standard code analysis
- Microsoft.CodeAnalysis.PublicApiAnalyzers — Tracks the public API surface via
PublicAPI.Shipped.txt/PublicAPI.Unshipped.txt; surfaces additions/removals at compile time as a breaking-change review gate
🛠️ Building from Source
Prerequisites
- .NET 10.0 SDK — required for the modern build / test / pack flow used by CI
- Optional: PowerShell Core for formatting scripts
Build Steps
# Clone the repository
git clone https://github.com/Chris-Wolfgang/String-Extensions.git
cd String-Extensions
# Restore dependencies
dotnet restore
# Build the solution
dotnet build --configuration Release
# Run tests
dotnet test --configuration Release
# Run the benchmarks (optional)
dotnet run -c Release --project benchmarks/Wolfgang.Extensions.String.Benchmarks -- --filter '*'
# Run code formatting (PowerShell Core)
pwsh ./scripts/format.ps1
Code Formatting
This project uses .editorconfig and dotnet format:
# Format code
dotnet format
# Verify formatting (as CI does)
dotnet format --verify-no-changes
See docs/README-FORMATTING.md for detailed formatting guidelines.
🤝 Contributing
Contributions are welcome! Please see CONTRIBUTING.md for:
- Code quality standards
- Build and test instructions
- Pull request guidelines
- Analyzer configuration details
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.