6

I have one date like 12/05/2012 now i would like to change that format in to simple string.

for ex.

string newdate = new string();
newdate = "12/05/2012";
DateTime Bdate = DateTime.ParseExact(Newdate, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

now my BDate is DateTime ie. BDate= 2012/05/12

now i want to do something like

if my Bdate is 12/05/2012 so i want a string which is similar like "Twelve May two thousand twelve"

How can i do this?

Please help me...

Thanks in advance....

RvdK
  • 19,580
  • 4
  • 64
  • 107
AB Vyas
  • 2,349
  • 6
  • 26
  • 43
  • May I ask why you want to do this? It is quite an unusual date format (and shouldn't it be `May the Twelfth, Two Thousand Twelve`?). – Frédéric Hamidi May 12 '12 at 17:18
  • 3
    @FrédéricHamidi: Only in the US. In the rest of the world, we pronounce it as “Twelfth May”. That’s the reason underlying the whole `MM/dd` vs `dd/MM` disparity. – Douglas May 12 '12 at 17:20
  • It also means this question calls for a culture-aware answer, both for the numbers and the date format itself. This will not be trivial. – Frédéric Hamidi May 12 '12 at 17:24
  • 1
    @Douglas not [only](http://en.wikipedia.org/wiki/Calendar_date#Middle-endian.2C_starting_with_month) the U.S., and not quite the [rest](http://en.wikipedia.org/wiki/Calendar_date#Gregorian_little-endian.2C_starting_with_day) of the world, nor are they the only [options](http://en.wikipedia.org/wiki/Calendar_date). – NominSim May 12 '12 at 17:25
  • There is no build in functionality. You have to create a function that does it on your own. It is not so difficult though. – George Karanikas May 12 '12 at 17:28
  • @NominSim: I was only referring to English-speaking countries; Asian countries would not use “twelve” or “May”. And it _[is](http://en.wikipedia.org/wiki/Date_format_by_country#Map)_ only the US per most sources. Even your source states “United States, partially in Canada, and a few other countries [citation needed]”. – Douglas May 12 '12 at 17:30
  • @amitvyas: See my answer. I have a working solution for you. – James Johnson May 12 '12 at 17:48
  • @Douglas I was just pointing out that "the rest of the world" doesn't necessarily use that format, trying to reinforce the notion that varying cultures need to be taken into account when you work with date formats. – NominSim May 12 '12 at 18:41
  • @NominSim: If you’re referring to the numeric representation, then yes; I’m personally a strong supporter of ISO 8601 too. – Douglas May 12 '12 at 18:51

4 Answers4

11

You'll need to look at each date part and use a function to get the written equivalent. I've included a class below that converts integers to written text, and extended it to support DateTime conversion as well:

public static class WrittenNumerics
{
    static readonly string[] ones = new string[] { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
    static readonly string[] teens = new string[] { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
    static readonly string[] tens = new string[] { "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
    static readonly string[] thousandsGroups = { "", " Thousand", " Million", " Billion" };

    private static string FriendlyInteger(int n, string leftDigits, int thousands)
    {
        if (n == 0)
            return leftDigits;

        string friendlyInt = leftDigits;
        if (friendlyInt.Length > 0)
            friendlyInt += " ";

        if (n < 10)
            friendlyInt += ones[n];
        else if (n < 20)
            friendlyInt += teens[n - 10];
        else if (n < 100)
            friendlyInt += FriendlyInteger(n % 10, tens[n / 10 - 2], 0);
        else if (n < 1000)
            friendlyInt += FriendlyInteger(n % 100, (ones[n / 100] + " Hundred"), 0);
        else
            friendlyInt += FriendlyInteger(n % 1000, FriendlyInteger(n / 1000, "", thousands + 1), 0);

        return friendlyInt + thousandsGroups[thousands];
    }

    public static string DateToWritten(DateTime date)
    {
        return string.Format("{0} {1} {2}", IntegerToWritten(date.Day), date.ToString("MMMM"), IntegerToWritten(date.Year));
    }

    public static string IntegerToWritten(int n)
    {
        if (n == 0)
            return "Zero";
        else if (n < 0)
            return "Negative " + IntegerToWritten(-n);

        return FriendlyInteger(n, "", 0);
    }
}

Disclaimer: Basic functionality courtesy of @Wedge

Using this class, just call the DateToWritten method:

var output = WrittenNumerics.DateToWritten(DateTime.Today);

The output of the above is: Twelve May Two Thousand Twelve

Community
  • 1
  • 1
James Johnson
  • 45,496
  • 8
  • 73
  • 110
2

This isn’t what you want, but the closest I can suggest using built-in functionality is ToLongDateString, which gives you the name of the month and is obviously culture-sensitive.

string str = bdate.ToLongDateString();
// Assuming en-US culture, this would give: "Saturday, May 12, 2012"
Douglas
  • 53,759
  • 13
  • 140
  • 188
1

Suppose 12/05/2012 is a string, then you have to tokenize it into elements which separated by slash "/". E.g:

"12/05/2012" -> ["12", "05", "2012"]

Next, you define yourself a rule which parses these elements to what you expect. Say, "12" is "twelve", "05" is "five" or "May", etc.

jaselg
  • 367
  • 3
  • 10
0
string MyDate = "12/05/2012";
DateTime expected = Convert.ToDateTime(MyDate);
string MyNewDate = expected.ToString("dd MMM yyyy");

Check other date format on this site https://www.mikesdotnetting.com/article/23/date-formatting-in-c .