Skip to content

Instantly share code, notes, and snippets.

@ramonsmits
Forked from terenced/string-format-extension.cs
Last active December 17, 2015 10:19
Show Gist options
  • Save ramonsmits/5593913 to your computer and use it in GitHub Desktop.
Save ramonsmits/5593913 to your computer and use it in GitHub Desktop.
Added alignment support for named values.
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web.UI;
namespace StringExtensions
{
/// <remarks>
/// http://james.newtonking.com/archive/2008/03/27/formatwith-string-format-extension-method.aspx
/// http://james.newtonking.com/archive/2008/03/29/formatwith-2-0-string-formatting-with-named-variables.aspx
/// </remarks>
public static class StringFormatExtension
{
static readonly Regex NamedFormatRegex = new Regex(@"(?<start>\{)+(?<property>[\w\.\[\]]+)(?<format>:[^}]+)?(?<end>\})+", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
public static string FormatWith(this string format, params object[] args)
{
if (format == null) throw new ArgumentNullException("format");
return string.Format(format, args);
}
public static string FormatWith(this string format, IFormatProvider provider, params object[] args)
{
if (format == null) throw new ArgumentNullException("format");
return string.Format(provider, format, args);
}
public static string FormatWith(this string format, object source)
{
return FormatWith(format, null, source);
}
public static string FormatWith(this string format, IFormatProvider provider, object source)
{
if (format == null) throw new ArgumentNullException("format");
var values = new List<object>();
string rewrittenFormat = NamedFormatRegex.Replace(format, delegate(Match m)
{
Group startGroup = m.Groups["start"];
Group propertyGroup = m.Groups["property"];
Group formatGroup = m.Groups["format"];
Group endGroup = m.Groups["end"];
values.Add((propertyGroup.Value == "0") ? source : DataBinder.Eval(source, propertyGroup.Value));
return new string('{', startGroup.Captures.Count) + (values.Count - 1) + formatGroup.Value + new string('}', endGroup.Captures.Count);
});
return string.Format(provider, rewrittenFormat, values.ToArray());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment