diff --git a/023_alphanumeric_data_format/023_csharp.md b/023_alphanumeric_data_format/023_csharp.md
new file mode 100644
index 0000000..24d4f45
--- /dev/null
+++ b/023_alphanumeric_data_format/023_csharp.md
@@ -0,0 +1,832 @@
+# Format alphanumeric data for presentation in C#
+
+## Introduction
+
+Suppose you work for a sales and marketing department that sends thousands of
+personalized letters to the company's existing clients who are institutional
+investors. Your team's job is to promote new financial products to the customer.
+Each letter you send merges personalized information about the customer. The
+letter compares the returns of their current portfolios with projected returns
+using the newest products. How do you merge and format the data correctly?
+
+From a high-level perspective, software developers are concerned with:
+
+- **data input**, including data typed in by a user from a keyboard, using
+their mouse, a device, or by another software system via a network request.
+- **data processing**, including decision logic, manipulating data, and
+performing calculations.
+- **data output**, including presentation to an end user via a command-line
+message, a window, a web page, or saving the processed data into a file, and
+sending it to a network service.
+
+To solve business problems in C#, you need to work with different types of data,
+such as strings and numbers. You also need to perform various operations on the
+data, such as calculations, comparisons, or conversions. In this module, you
+output string and numeric data in C# using various formatting options. You also
+create a receipt mockup and a personalized marketing message using data merging
+techniques.
+
+### Learning objectives
+
+In this module, you will:
+
+- Merge string templates with variables using composite formatting.
+- Use various format specifiers to properly display percentages, currency, and
+numbers.
+- Use padding methods to properly align string values.
+
+---
+
+## Exercise - Investigate string formatting basics
+
+In this unit, you learn methods to format strings for efficient display,
+especially for cases using multiple variables.
+
+### What is Composite Formatting?
+
+*Composite formatting* uses numbered placeholders within a string. At run time,
+everything inside the braces is resolved to a value that is also passed in
+based on their position.
+
+This example of composite formatting uses a built-in method `Format()` on the
+`string` data type keyword. Update your code in the editor as follows:
+
+```cs
+string first = "Hello";
+string second = "World";
+string result = string.Format("{0} {1}!", first, second);
+Console.WriteLine(result);
+```
+
+If you run this code, you observe the following output.
+
+```txt
+Hello World!
+```
+
+There are a few important things to notice about this code.
+
+- Data types and variables of a given data type have built-in "helper methods"
+to make certain tasks easy.
+- The literal string `"{0} {1}!"` forms a template, parts of which are replaced
+at run time.
+- The token `{0}` is replaced by the first argument after the string template,
+in other words, the value of the variable `first`.
+- The token `{1}` is replaced by the second argument after the string template,
+in other words, the value of the variable `second`.
+
+> Note
+> You may think it's odd to start with the number 0. Actually this is very
+common in software development. Whenever there's a sequence of items that can
+be identified using a number, the numbering will usually start at 0.
+
+Update your code as follows:
+
+```cs
+string first = "Hello";
+string second = "World";
+Console.WriteLine("{1} {0}!", first, second);
+Console.WriteLine("{0} {0} {0}!", first, second);
+```
+
+Save your code file, and then run your code. You should see the following
+output:
+
+```txt
+World Hello!
+Hello Hello Hello!
+```
+
+A few observations about these examples:
+
+- For the first `Console.WriteLine()` statement, observe that the tokens can be
+arranged in any order. The sample code has `{1}` before `{0}`.
+- For the second `Console.WriteLine()` statement, observe that the tokens can be
+reused with three instances of `{0}`. Also, the second variable argument,
+`second`, isn't used. Yet, the code still runs without error.
+
+#### What is string interpolation?
+
+*String interpolation* is a technique that simplifies composite formatting.
+
+Instead of using a numbered token and including the literal value or variable
+name in a list of arguments to `String.Format()` or `Console.WriteLine()`, you
+can just use the variable name inside of the curly braces.
+
+In order for a string to be interpolated, you must prefix it with the `$`
+directive. Now, create the same examples from earlier using string interpolation
+instead of composite formatting. Update your code as follows:
+
+```cs
+string first = "Hello";
+string second = "World";
+Console.WriteLine($"{first} {second}!");
+Console.WriteLine($"{second} {first}!");
+Console.WriteLine($"{first} {first} {first}!");
+```
+
+Save your code file, and then run your code. You should see the following
+output:
+
+```txt
+Hello World!
+World Hello!
+Hello Hello Hello!
+```
+
+> Note
+> If you look at code examples in books and online, you're likely to see both
+*composite formatting* and *string interpolation* used, but generally you should
+choose *string interpolation*.
+
+#### Formatting currency
+
+Composite formatting and string interpolation can be used to format values for
+display given a specific language and culture. In the following example, the
+`:C` currency format specifier is used to present the `price` and `discount`
+variables as currency. Update your code as follows:
+
+```cs
+decimal price = 123.45m;
+int discount = 50;
+Console.WriteLine($"Price: {price:C} (Save {discount:C})");
+```
+
+If you executed this code on a computer that has its Windows display language
+set to "English (United States)", you observe the following output.
+
+```txt
+Price: $123.45 (Save $50.00)
+```
+
+Notice how adding the `:C` to the tokens inside of the curly braces formats the
+number as currency regardless of whether you use `int` or `decimal`.
+
+> Note
+> What happens if your country/region and language isn't known? If you run the
+previous code in the "in-browser" .NET Editor, such as at
+[TrydotNet](https://dotnet.microsoft.com/en-us/platform/try-dotnet) you'll see
+the following output: `Price: ¤123.45 (Save ¤50.00)`. The symbol `¤` is used
+instead of the symbol for your country/region's money. This is a generic symbol
+used to denote "currency" regardless of the *type* of currency. You see this
+symbol in the .NET Editor because it ignores your current location.
+
+### How the user's country/region and language affect string formatting
+
+What if you execute the previous code on a computer in France that has its
+Windows Display Language set to French? In that case you would see the
+following output.
+
+```txt
+Price: 123,45 € (Save 50,00 €)
+```
+
+The reason for the previous "€" output is that the string currency formatting
+feature is dependent on the local computer setting for culture. In this context,
+the term "culture" refers to the country/region and language of the end user.
+The culture code is a five character string that computers use to identify the
+location and language of the end user. The culture code ensures certain
+information like dates and currency can be presented properly.
+
+For example:
+
+- the culture code of an English speaker in the USA is `en-US`.
+- the culture code of a French speaker in France is `fr-FR`.
+- the culture code of a French speaker in Canada is `fr-CA`.
+
+The culture affects the writing system, the calendar that's used, the sort
+order of strings, and formatting for dates and numbers (like formatting
+currency).
+
+Unfortunately, making sure your code works correctly on all computers
+regardless of the country/region or the end user's language is challenging.
+This process is known as *localization* (or *globalization*). Localization
+depends on many factors not discussed in this module, but simply, the string
+formatting syntax might use a different format depending on the user's culture.
+
+#### Formatting numbers
+
+When working with numeric data, you might want to format the number for
+readability by including commas to delineate thousands, millions, billions, and
+so on.
+
+The `N` numeric format specifier makes numbers more readable. Update your code
+as follows:
+
+```txt
+decimal measurement = 123456.78912m;
+Console.WriteLine($"Measurement: {measurement:N} units");
+```
+
+If you're viewing this from the `en-US` culture, you observe the following
+output.
+
+```txt
+Measurement: 123,456.79 units
+```
+
+By default, the `N` numeric format specifier displays only two digits after the
+decimal point.
+
+If you want to display more precision, you can do that by adding a number after
+the specifier. The following code will display four digits after the decimal
+point using the `N4` specifier. Update your code as follows:
+
+```cs
+decimal measurement = 123456.78912m;
+Console.WriteLine($"Measurement: {measurement:N4} units");
+```
+
+If you're viewing this from the `en-US` culture, you observe the following
+output.
+
+```txt
+Measurement: 123,456.7891 units
+```
+
+#### Formatting percentages
+
+Use the `P` format specifier to format percentages and rounds to 2 decimal
+places. Add a number afterwards to control the number of values displayed after
+the decimal point. Update your code as follows:
+
+```cs
+decimal tax = .36785m;
+Console.WriteLine($"Tax rate: {tax:P2}");
+```
+
+If you're viewing this from the `en-US` culture, you observe the following
+output.
+
+```txt
+Tax rate: 36.79%
+```
+
+#### Combining formatting approaches
+
+String variables can store strings created using formatting techniques. In the
+following example, decimals and decimal math results are formatted and stored
+in the `yourDiscount` string using composite formatting.
+
+Update your code as follows.
+
+```cs
+decimal price = 67.55m;
+decimal salePrice = 59.99m;
+
+string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);
+
+Console.WriteLine(yourDiscount);
+```
+
+If you're viewing this from the `en-US` culture, you observe the following
+output.
+
+```txt
+You saved $7.56 off the regular $67.55 price.
+```
+
+You can combine multiple formatted strings. Build on the previous code
+concatenating the calculated percentage using the string interpolation instead
+of string concatenation by inserting
+`yourDiscount += $"A discount of {(price - salePrice)/price:P2}!";` into the
+code on the line before `Console.WriteLine()`.
+
+> Note
+> You don't need to use `String.Format()` with this string interpolation
+approach.
+
+Update your code as follows.
+
+```cs
+decimal price = 67.55m;
+decimal salePrice = 59.99m;
+
+string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);
+
+yourDiscount += $"A discount of {((price - salePrice)/price):P2}!"; //inserted
+Console.WriteLine(yourDiscount);
+```
+
+If you're viewing this unit from the `en-US` culture, you observe the following
+output.
+
+```txt
+You saved $7.56 off the regular $67.55 price. A discount of 11.19%!
+```
+
+### Recap
+
+Here are most important takeaways from this unit about string formatting:
+
+- You can use composite formatting or string interpolation to format strings.
+- With **composite formatting**, you use a string template containing one or
+more replacement tokens in the form `{0}`. You also supply a list of arguments
+that are matched with the replacement tokens based on their order. Composite
+formatting works when using `string.Format()` or `Console.WriteLine()`.
+- With **string interpolation**, you use a string template containing the
+variable names you want replaced surrounded by curly braces. Use the `$`
+directive before the string template to indicate you want the string to be
+interpolated.
+- Format currency using a `:C` specifier.
+- Format numbers using a `:N` specifier. Control the precision (number of values
+after the decimal point) using a number after the `:N` like `{myNumber:N3}`.
+- Format percentages using the `:P` format specifier.
+- Formatting currency and numbers depend on the end user's culture, a five
+character code that includes the user's country/region and language (per the
+settings on their computer).
+
+---
+
+## Exercise
+
+### Explore string interpolation
+
+You need to create the code to print a receipt for the customer purchasing
+shares of an investment product. The shares are purchased automatically at the
+end of the year based on a series of payroll deductions, so the number of
+shares purchased usually contains a decimal amount. To print the receipt, you
+would likely need to combine data of different types, including fractional
+values, currency, and percentages in precise ways.
+
+### Display the invoice number using string interpolation
+
+Update your code in the editor as follows:
+
+```cs
+int invoiceNumber = 1201;
+decimal productShares = 25.4568m;
+decimal subtotal = 2750.00m;
+decimal taxPercentage = .15825m;
+decimal total = 3185.19m;
+
+Console.WriteLine($"Invoice Number: {invoiceNumber}");
+```
+
+The Program.cs file must be saved before building or running the code.
+
+At the Terminal command prompt, to run your code, type `dotnet run` and then
+press Enter.
+
+You should see the following output:
+
+```txt
+Invoice Number: 1201
+```
+
+> Note
+> You may see several warnings such as `warning CS0219: The variable
+'productShares' is assigned but its value is never used` for all the variables
+that were defined but not yet used in the code.
+
+### Display the product shares with one thousandth of a share (0.001) precision
+
+Since you bill the customers using fractions of shares even though the precision
+is one ten thousandth (0.0001), you'll only display three digits after the
+decimal point.
+
+Add the following code below the code you typed previously:
+
+```cs
+Console.WriteLine($" Shares: {productShares:N3} Product");
+```
+
+Save your code file, and then run your code.
+
+When you run the code, you should see the following output:
+
+```txt
+Invoice Number: 1201
+ Shares: 25.457 Product
+```
+
+### Display the subtotal that you charge the customer formatted as currency
+
+Add the following code below the code you typed in steps 1 and 2:
+
+```cs
+Console.WriteLine($" Sub Total: {subtotal:C}");
+```
+
+When you run the code, you should see the following output:
+
+```txt
+Invoice Number: 1201
+ Shares: 25.457 Product
+ Sub Total: $2,750.00
+```
+
+> Note
+> The sample shows the "$" but you may see a different regional currency symbol.
+
+### Display the tax charged on the sale formatted as a percentage
+
+Add the following code below the code you typed in steps 1 through 3:
+
+```cs
+Console.WriteLine($" Tax: {taxPercentage:P2}");
+```
+
+When you run the code, you should see the following output:
+
+```txt
+Invoice Number: 1201
+ Shares: 25.457 Product
+ Sub Total: $2,750.00
+ Tax: 15.83%
+```
+
+### Finalize the receipt with the total amount due formatted as currency
+
+Add the following code below the code you typed in steps 1 through 4:
+
+```cs
+Console.WriteLine($" Total Billed: {total:C}");
+```
+
+The entire code for the exercise should match as follows:
+
+```cs
+int invoiceNumber = 1201;
+decimal productShares = 25.4568m;
+decimal subtotal = 2750.00m;
+decimal taxPercentage = .15825m;
+decimal total = 3185.19m;
+
+Console.WriteLine($"Invoice Number: {invoiceNumber}");
+Console.WriteLine($" Shares: {productShares:N3} Product");
+Console.WriteLine($" Sub Total: {subtotal:C}");
+Console.WriteLine($" Tax: {taxPercentage:P2}");
+Console.WriteLine($" Total Billed: {total:C}");
+```
+
+When you run the code, you should see the following output:
+
+```txt
+Invoice Number: 1201
+ Shares: 25.457 Product
+ Sub Total: $2,750.00
+ Tax: 15.83%
+ Total Billed: $3,185.19
+```
+
+---
+
+## Exercise
+
+### Discover padding and alignment
+
+The `string.Format()` method is used to perform composite formatting such as in
+the example:
+
+```cs
+string first = "Hello";
+string second = "World";
+string result = string.Format("{0} {1}!", first, second);
+Console.WriteLine(result);
+```
+
+It may have seemed a bit strange that a keyword that represents a data type has
+methods you can call in the same way that you call methods on the `Console`
+class. The fact is that there are many similar methods on the `string` data type
+and any literal string or variable of type string.
+
+Here's a brief list of categories of these built-in methods so you can get an
+idea of what's possible.
+
+- Methods that add blank spaces for formatting purposes (`PadLeft()`,
+`PadRight()`)
+- Methods that compare two strings or facilitate comparison (`Trim()`,
+`TrimStart()`, `TrimEnd()`, `GetHashcode()`, the `Length` property)
+- Methods that help you determine what's inside of a string, or even retrieve
+just a part of the string (`Contains()`, `StartsWith()`, `EndsWith()`,
+`Substring()`)
+- Methods that change the content of the string by replacing, inserting, or
+removing parts (`Replace()`, `Insert()`, `Remove()`)
+- Methods that turn a string into an array of strings or characters (`Split()`,
+`ToCharArray()`)
+
+### Formatting strings by adding whitespace before or after
+
+The `PadLeft()` method adds blank spaces to the left-hand side of the string so
+that the total number of characters equals the argument you send it. In this
+case, you want the total length of the string to be 12 characters.
+
+Update your code in the editor as follows:
+
+```cs
+string input = "Pad this";
+Console.WriteLine(input.PadLeft(12));
+```
+
+At the Terminal command prompt, to run your code, type `dotnet run` and then
+press Enter.
+
+When you run the code, you observe four characters prefixed to the left of the
+string bring the length to 12 characters long.
+
+```txt
+ Pad this
+```
+
+To add space or characters to the right side of your string, use the
+`PadRight()` method instead. 1. Update your code in the editor as follows:
+
+```cs
+Console.WriteLine(input.PadRight(12));
+```
+
+Save your code file, and then run your code. You won't observe any characters
+added to the end of the string, but they're there.
+
+#### What is an overloaded method?
+
+In C#, an overloaded method is another version of a method with different or
+extra arguments that modify the functionality of the method slightly, as is the
+case with the overloaded version of the `PadLeft()` method.
+
+You can also call a second overloaded version of the method and pass in
+whatever character you want to use instead of a space. In this case, you fill
+the extra space with the dash character.
+
+Update your code in the editor as follows:
+
+```cs
+Console.WriteLine(input.PadLeft(12, '-'));
+Console.WriteLine(input.PadRight(12, '-'));
+```
+
+Save your code file, and then run your code. You should see four dashes
+prefixing the left of the string that is 12 characters long.
+
+```txt
+ ----Pad this
+ Pad this----
+```
+
+Now, apply this newfound knowledge to another real world scenario.
+
+### Working with padded strings
+
+Suppose you work for a payment processing company that still supports legacy
+mainframe systems. Often, those systems require data to be input in specific
+columns. For example, store the Payment ID in columns 1 through 6, the payee's
+name in columns 7 through 30, and the Payment Amount in columns 31 through 40.
+Also, importantly, the Payment Amount is right-aligned.
+
+You're asked to build an application that will convert data in the relational
+database management system to the legacy file format. To ensure that the
+integration works correctly, the first step is to confirm the file format by
+giving the legacy system maintainers a sample of the output. Later, you build
+on this work to send hundreds or thousands of payments to be processed via an
+ASCII text file.
+
+#### Add the Payment ID to the output
+
+To get started, print the Payment ID in the first six columns. You pick some
+random payment data that should be adequate for the purposes.
+
+Update your code in the editor as follows:
+
+```cs
+string paymentId = "769C";
+var formattedLine = paymentId.PadRight(6);
+Console.WriteLine(formattedLine);
+```
+
+Reuse the `formattedLine` variable to build the output string.
+
+Save your code file, and then run your code. You should see the following
+output:
+
+```txt
+769C
+```
+
+There are two blank spaces to the right that not visible. You'll confirm that
+they exist in the next step.
+
+#### Add the payee name to the output
+
+Next, you add a fictitious Payee Name, padding it appropriately.
+
+Update your code as follows:
+
+```cs
+string paymentId = "769C";
+string payeeName = "Mr. Stephen Ortega";
+
+var formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+
+Console.WriteLine(formattedLine);
+```
+
+The `+=` operator performs a string concatenation, taking the previous value of
+the variable `formattedLine` and adding the new value to it. It's a shortened
+equivalent the following code example:
+
+```cs
+formattedLine = formattedLine + payeeName.PadRight(24);
+```
+
+Save your code file, and then run your code. You should see the following
+output:
+
+```txt
+769C Mr. Stephen Ortega
+```
+
+Again, there are quite a few blank spaces after the Payee's Name. Also, there
+are two blank spaces after the Payment ID from Step 1.
+
+#### Add the payment amount to the output
+
+Next, add a fictitious Payment Amount and make sure to use `PadLeft()` to right
+-align the output.
+
+Update your code as follows:
+
+```cs
+string paymentId = "769C";
+string payeeName = "Mr. Stephen Ortega";
+string paymentAmount = "$5,000.00";
+
+var formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+formattedLine += paymentAmount.PadLeft(10);
+
+Console.WriteLine(formattedLine);
+```
+
+Save your code file, and then run your code. You should see the following
+output:
+
+```txt
+769C Mr. Stephen Ortega $5,000.00
+```
+
+This output is pretty close to what you understood the legacy system
+maintainers were looking for.
+
+#### Add a line of numbers above the output to more easily confirm the result
+
+Since it's difficult to count the exact columns where each data element appears,
+you add a line directly above the output that helps you count the columns.
+
+```cs
+Console.WriteLine("1234567890123456789012345678901234567890");
+```
+
+Update your code in the Visual Studio Code Editor as follows:
+
+```txt
+string paymentId = "769C";
+string payeeName = "Mr. Stephen Ortega";
+string paymentAmount = "$5,000.00";
+
+var formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+formattedLine += paymentAmount.PadLeft(10);
+
+Console.WriteLine("1234567890123456789012345678901234567890");
+Console.WriteLine(formattedLine);
+```
+
+Save your code file, and then run your code. You should see the following
+output, that you can send off to the maintainers of the legacy system to
+confirm the new integration works correctly:
+
+```txt
+1234567890123456789012345678901234567890
+769C Mr. Stephen Ortega $5,000.00
+```
+
+Success!
+
+### Recap
+
+There's a few important takeaways from this unit.
+
+- The `string` data type, literal strings, and variables of type string each
+implement many helper methods to format, modify, and perform other operations
+on strings.
+- The `PadLeft()` and `PadRight()` methods add white space (or optionally,
+another character) to the total length of a string.
+- Use `PadLeft()` to right-align a string.
+- Some methods are overloaded, meaning they have multiple versions of the
+method with different arguments that affect their functionality.
+- The `+=` operator concatenates a new string on the right to the existing
+string on the left.
+
+---
+
+## Exercise
+
+### Complete a challenge to apply string interpolation to a form letter
+
+For the sales and marketing company's newest investment products, you send
+thousands of personalized letters to the company's existing clients. Your job
+is to write C# code to merge personalized information about the customer. The
+letter contains information like their existing portfolio and compares their
+current returns to projected returns if they were to invest in using the new
+products.
+
+The writers have decided on the following example marketing message. Here's the
+desired output (using fictitious customer account data).
+
+```txt
+Dear Ms. Barros,
+As a customer of our Magic Yield offering we are excited to tell you about a new financial product that would dramatically increase your return.
+
+Currently, you own 2,975,000.00 shares at a return of 12.75%.
+
+Our new product, Glorious Future offers a return of 13.13%. Given your current volume, your potential profit would be ¤63,000,000.00.
+
+Here's a quick comparison:
+
+Magic Yield 12.75% $55,000,000.00
+Glorious Future 13.13% $63,000,000.00
+```
+
+Use your new found knowledge of string formatting to build an application that
+can merge and format the appropriate content given the previous example output.
+Pay particular attention to the white space and make sure you accurately
+represent this exact format using C#.
+
+Add the following code to get the data for the challenge:
+
+```cs
+string customerName = "Ms. Barros";
+
+string currentProduct = "Magic Yield";
+int currentShares = 2975000;
+decimal currentReturn = 0.1275m;
+decimal currentProfit = 55000000.0m;
+
+string newProduct = "Glorious Future";
+decimal newReturn = 0.13125m;
+decimal newProfit = 63000000.0m;
+
+// Your logic here
+
+Console.WriteLine("Here's a quick comparison:\n");
+
+string comparisonMessage = "";
+
+// Your logic here
+
+Console.WriteLine(comparisonMessage);
+```
+
+Use the code editor to generate the message while using the given variables and
+code.
+
+Ensure your code outputs the following message:
+
+```txt
+Dear Ms. Barros,
+As a customer of our Magic Yield offering we are excited to tell you about a new financial product that would dramatically increase your return.
+
+Currently, you own 2,975,000.00 shares at a return of 12.75%.
+
+Our new product, Glorious Future offers a return of 13.13%. Given your current volume, your potential profit would be $63,000,000.00.
+
+Here's a quick comparison:
+
+Magic Yield 12.75% $55,000,000.00
+Glorious Future 13.13% $63,000,000.00
+```
+
+Good luck!
+
+Whether you get stuck and need to peek at the solution or you finish
+successfully, continue on to view a solution to this challenge.
+
+---
+
+### Summary
+
+Your company needed to create a personalized marketing message to promote a new
+financial product to your customers. Using C#, you were able to write code that
+combined string and numeric data about your current customers.
+
+You exercised different techniques for merging a string template with variables
+using composite formatting and string interpolation. The various specifiers
+allow you to properly format large numbers, currency, and percentages. The
+built-in methods on variables of type string allowed you to add padding to left
+and right align data.
+
+Imagine how much extra work is required if you didn't have a wealth of string
+and number formatting tools and techniques available to you in C#. You would
+likely attempt to use string concatenation everywhere, possibly making it
+difficult to maintain or update.
+
+Techniques and tools for formatting strings and numeric data has a wide array
+of applications. For example, you can use these techniques to present data for
+display on screen and format data to transfer between disparate systems.
+
+#### Resources
+
+[String.Format Method](https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-7.0&preserve-view=true)
+[Standard Numeric Format Strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings)
diff --git a/023_alphanumeric_data_format/alpha_num_format/Program.cs b/023_alphanumeric_data_format/alpha_num_format/Program.cs
new file mode 100644
index 0000000..b2e479b
--- /dev/null
+++ b/023_alphanumeric_data_format/alpha_num_format/Program.cs
@@ -0,0 +1,58 @@
+string first = "Hello";
+string second = "World";
+string result = string.Format("{0} {1}!", first, second);
+Console.WriteLine(result);
+
+Console.WriteLine("\n--------------------------\n");
+
+Console.WriteLine("{1} {0}!", first, second);
+Console.WriteLine("{0} {0} {0}!", first, second);
+
+Console.WriteLine("\n--------------------------\n");
+
+Console.WriteLine($"{first} {second}!");
+Console.WriteLine($"{second} {first}!");
+Console.WriteLine($"{first} {first} {first}!");
+
+Console.WriteLine("\n--------------------------\n");
+
+decimal price = 123.45m;
+int discount = 50;
+Console.WriteLine($"Price: {price:C} (Save {discount:C})");
+
+Console.WriteLine("\n--------------------------\n");
+
+decimal measurement = 123456.78912m;
+Console.WriteLine($"Measurement: {measurement:N4} units");
+
+Console.WriteLine("\n--------------------------\n");
+
+decimal tax = .36785m;
+Console.WriteLine($"Tax rate: {tax:P2}");
+
+Console.WriteLine("\n--------------------------\n");
+
+decimal price_2 = 67.55m;
+decimal saleprice_2 = 59.99m;
+
+string yourDiscount = String.Format(
+ "You saved {0:C2} off the regular {1:C2} price_2. ",
+ (price_2 - saleprice_2),
+ price_2
+);
+
+Console.WriteLine(yourDiscount);
+
+Console.WriteLine("\n--------------------------\n");
+
+decimal price_3 = 67.55m;
+decimal saleprice_3 = 59.99m;
+
+string yourDiscount_2 = String.Format(
+ "You saved {0:C2} off the regular {1:C2} price_3. ",
+ (price_3 - saleprice_3),
+ price_3
+);
+
+yourDiscount += $"A discount of {((price_3 - saleprice_3)/price_3):P2}!"; //inserted
+Console.WriteLine(yourDiscount_2);
diff --git a/023_alphanumeric_data_format/alpha_num_format/alpha_num_format.csproj b/023_alphanumeric_data_format/alpha_num_format/alpha_num_format.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/023_alphanumeric_data_format/alpha_num_format/alpha_num_format.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/023_alphanumeric_data_format/form_letter/Program.cs b/023_alphanumeric_data_format/form_letter/Program.cs
new file mode 100644
index 0000000..a6af5bd
--- /dev/null
+++ b/023_alphanumeric_data_format/form_letter/Program.cs
@@ -0,0 +1,32 @@
+string customerName = "Ms. Barros";
+
+string currentProduct = "Magic Yield";
+int currentShares = 2975000;
+decimal currentReturn = 0.1275m;
+decimal currentProfit = 55000000.0m;
+
+string newProduct = "Glorious Future";
+decimal newReturn = 0.13125m;
+decimal newProfit = 63000000.0m;
+
+var formatted_letter = string.Format("Dear {0},\n", customerName);
+formatted_letter += $"As a customer of our {currentProduct} offering we" +
+ "are excited to tell you about a new financial " +
+ "product that would dramatically increase your " +
+ "return.\n\n";
+formatted_letter += $"Currently, you own {currentShares:N2} shares at a return ";
+formatted_letter += $"of {currentReturn:P2}.\n\n";
+formatted_letter += $"Our new product, {newProduct} offers a return of ";
+formatted_letter += $"{newReturn:P2}. Given your current volume, your ";
+formatted_letter += $"potential profit would be {newProfit:C2}.\n";
+Console.WriteLine(formatted_letter);
+Console.WriteLine("Here's a quick comparison:\n");
+
+string comparisonMessage = currentProduct.PadRight(20);
+comparisonMessage += $"{currentReturn:P2}".PadRight(9);
+comparisonMessage += $"{currentProfit:C2}\n";
+comparisonMessage += $"{newProduct}".PadRight(20);
+comparisonMessage += $"{newReturn:P2}".PadRight(9);
+comparisonMessage += $"{newProfit:C2}";
+
+Console.WriteLine(comparisonMessage);
diff --git a/023_alphanumeric_data_format/form_letter/form_letter.csproj b/023_alphanumeric_data_format/form_letter/form_letter.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/023_alphanumeric_data_format/form_letter/form_letter.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/023_alphanumeric_data_format/padding_alignment/Program.cs b/023_alphanumeric_data_format/padding_alignment/Program.cs
new file mode 100644
index 0000000..160b5d4
--- /dev/null
+++ b/023_alphanumeric_data_format/padding_alignment/Program.cs
@@ -0,0 +1,59 @@
+string first = "Hello";
+string second = "World";
+string result = string.Format("{0} {1}!", first, second);
+Console.WriteLine(result);
+
+Console.WriteLine("\n---------------------\n");
+
+string input = "Pad this";
+Console.WriteLine(input.PadLeft(12));
+
+Console.WriteLine("\n---------------------\n");
+
+Console.WriteLine(input.PadRight(12));
+
+Console.WriteLine("\n---------------------\n");
+
+Console.WriteLine(input.PadLeft(12, '-'));
+Console.WriteLine(input.PadRight(12, '-'));
+
+Console.WriteLine("\n---------------------\n");
+
+string paymentId = "769C";
+var formattedLine = paymentId.PadRight(6);
+Console.WriteLine(formattedLine);
+
+Console.WriteLine("\n---------------------\n");
+
+paymentId = "769C";
+string payeeName = "Mr. Stephen Ortega";
+
+formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+
+Console.WriteLine(formattedLine);
+
+Console.WriteLine("\n---------------------\n");
+
+paymentId = "769C";
+payeeName = "Mr. Stephen Ortega";
+string paymentAmount = "$5,000.00";
+
+formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+formattedLine += paymentAmount.PadLeft(10);
+
+Console.WriteLine(formattedLine);
+
+Console.WriteLine("\n---------------------\n");
+
+paymentId = "769C";
+payeeName = "Mr. Stephen Ortega";
+paymentAmount = "$5,000.00";
+
+formattedLine = paymentId.PadRight(6);
+formattedLine += payeeName.PadRight(24);
+formattedLine += paymentAmount.PadLeft(10);
+
+Console.WriteLine("1234567890123456789012345678901234567890");
+Console.WriteLine(formattedLine);
diff --git a/023_alphanumeric_data_format/padding_alignment/padding_alignment.csproj b/023_alphanumeric_data_format/padding_alignment/padding_alignment.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/023_alphanumeric_data_format/padding_alignment/padding_alignment.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/023_alphanumeric_data_format/string_interpolation/Program.cs b/023_alphanumeric_data_format/string_interpolation/Program.cs
new file mode 100644
index 0000000..96577e7
--- /dev/null
+++ b/023_alphanumeric_data_format/string_interpolation/Program.cs
@@ -0,0 +1,11 @@
+int invoiceNumber = 1201;
+decimal productShares = 25.4568m;
+decimal subtotal = 2750.00m;
+decimal taxPercentage = .15825m;
+decimal total = 3185.19m;
+
+Console.WriteLine($"Invoice Number: {invoiceNumber}");
+Console.WriteLine($" Shares: {productShares:N3} Product");
+Console.WriteLine($" Sub Total: {subtotal:C}");
+Console.WriteLine($" Tax: {taxPercentage:P2}");
+Console.WriteLine($" Total Billed: {total:C}");
diff --git a/023_alphanumeric_data_format/string_interpolation/string_interpolation.csproj b/023_alphanumeric_data_format/string_interpolation/string_interpolation.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/023_alphanumeric_data_format/string_interpolation/string_interpolation.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/README.md b/README.md
index efef5d9..67e281b 100644
--- a/README.md
+++ b/README.md
@@ -27,3 +27,4 @@ Following
20. [Choose the correct data type](./020_data_types/020_csharp.md)
21. [Convert data types](./021_Casting_and_conversion_techniques/021_csharp.md)
22. [Array Operations](./022_array_operations/022_csharp.md)
+23. [Format alphanumeric data](/023_alphanumeric_data_format/023_csharp.md)