« Work continues on dasBlog... | Main | Now THERE'S a Training Session I'd like ... »

Well, here you go, it's my implementation of a FormattableObject that I mentioned earlier. Take a look at the comments, Mark Miller had some great ideas, the best of which being a CodeRush plugin that handles the static analysis at design time and makes it harder to mess up these strings.

You can do this:

[Test]

public void MakePersonFormattedStringWithFormat()

{

    Person p = new Person();

    string foo = p.ToString("{BirthDate:D} My name is {FirstName} {LastName} and I'm cool.");

    Assert.AreEqual("Tuesday, January 22, 1974 My name is Scott Hanselman and I'm cool.", foo);

}

or

[Test]

public void MakePersonFormattedStringWithFormatAndChineseCulture()

{

    Person p = new Person();

    string foo = p.ToString("{BirthDate:D} My name is {FirstName} {LastName} and I'm cool.",new System.Globalization.CultureInfo("zh-cn"));

    Assert.AreEqual("1974?1?22? My name is Scott Hanselman and I'm cool.", foo);

}

You can either:

  • Derive your objects from FormattableObject and you get these ToString implementations for free

or

  • Implement a few ToString's and IFormattable yourself and delegate over to the static implementations in FormattableObject:

 
public string ToString(string format, System.IFormatProvider formatProvider)

{

    return Corillian.Voyager.Common.ObjectFormatString.ToString(this,format,formatProvider);

}

 

public string ToString(string format)

{

    return this.ToString(format,null);

}

Here you go, enjoy.  If you don't, screw you.  If you do, I take full credit.

FormattableObject 0.5 (11kb)

Tracked by:
"ObjectToString()" (VBASPCoder.com(日本語版)) [Trackback]
"The DebuggerDisplayAttribute in Visual Studio 2005 and IFormattable" (ComputerZ... [Trackback]
" Aggregated reflection-based ToString() implementation" (.Net Adventures ) [Trackback]
http://ianwhite.is-a-geek.net/PermaLink.aspx?guid=68ae51dd-d60a-48ea-9cd6-ac0e08... [Pingback]
"Better String.Format" (AGBlog) [Trackback]


Monday, January 31, 2005 12:22:22 AM (Pacific Standard Time, UTC-08:00)
Yes, it seems to work well with Japanese characters (environment) as well. I updated my blog entry after trying your code out.

http://www.vbaspcoder.com/PermaLink,guid,13fe24f3-7129-4b42-8d0b-253d8e829f60.aspx
Wednesday, February 02, 2005 5:48:57 AM (Pacific Standard Time, UTC-08:00)
It can be cleaner...
Instead of manually building the result string, you could use:

reg.Replace(aFormat, new MatchEvaluator(Evaluate));

The regex would be (no IgnoreCase needed): @"{([^}]+)}"

And:

string Evaluate(Match match)
{
string property = match.Groups[1].Value;
...
}
Diego Mijelshon
Thursday, February 24, 2005 2:48:37 PM (Pacific Standard Time, UTC-08:00)
Very nice!
I took your idea and slapped together a version that runs on datasets. Completely different implementation, nowhere near as spiffy as using reflection, but still with the human readable string goodness. It's at http://www.aigee.org/agblog/archives/762-Better-String.Format.html if anyone is interested. Try not to laugh too hard at the coded-in-5-minutes sloppy code :)
Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Archives

November, 2009 (5)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads