2012-05-12 12 views
6

Tengo una fecha como 12/05/2012 ahora me gustaría cambiar ese formato en una cadena simple.¿Cómo convertir formato de fecha a palabra?

por ej.

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

ahora mi BDate es decir DateTime . BDate= 2012/05/12

ahora quiero hacer algo como

si mi BDate es 12/05/2012 así que quiero una cadena que es similar como "Doce mayo de dos mil doce"

cómo puedo hacer ¿esta?

Por favor, ayúdame ...

Gracias de antemano ....

+0

¿Puedo preguntar por qué quieres hacer esto? Es un formato de fecha bastante inusual (¿y no debería ser 'Mayo el Duodécimo, Dos Mil Doce '?). –

+3

@ FrédéricHamidi: Solo en los EE. UU. En el resto del mundo, lo pronunciamos como "Doce de mayo". Esa es la razón subyacente de toda la disparidad 'MM/dd' vs' dd/MM'. – Douglas

+0

@Douglas, ah, lo entiendo. Gracias por su aclaración :) –

Respuesta

9

Deberá tener en cuenta cada parte de fecha y utilizar una función para obtener el equivalente escrito. He incluido una clase más adelante que convierte enteros de texto escrito, y lo extendió para apoyar la conversión DateTime así:

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); 
    } 
} 

responsabilidad: cortesía funcionalidad básica de @Wedge

Usando esta clase, simplemente llame al método DateToWritten:

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

La salida de lo anterior es: Twelve May Two Thousand Twelve

+0

gracias por su gran ayuda ... :) –

1

Esto no es lo que quiere, pero lo más cerca que puede sugerir el uso de la funcionalidad integrada es ToLongDateString, que le da el nombre del mes y obviamente es culturalmente sensible.

string str = bdate.ToLongDateString(); 
// Assuming en-US culture, this would give: "Saturday, May 12, 2012" 
+0

No necesito esto. Quiero Doce de mayo, Dos Mil Doce –

1

Supongamos 12/05/2012 es una cadena, entonces usted tiene que tokenize en el que los elementos separados por barra "/". Por ejemplo:

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

A continuación, se define a sí mismo una regla que analiza estos elementos a lo que esperar. Diga, "12" es "doce", "05" es "cinco" o "mayo", etc.

+0

Creo que convertirlos en números escritos es lo que OP está teniendo problemas con ... –

Cuestiones relacionadas