2010-01-06 12 views
3

J'ai une chaîne qui pourrait être entre 1 et 8 caractères. J'ai besoin de les convertir en un jour, un mois et un an. Pour les pièces manquantes, je vais utiliser celui en cours.C#: Comment simplifier cette chaîne de nombres-à-divers-date-parties-code

Le code que j'ai maintenant est plutôt gros et moche, et je me demandais si quelqu'un avait une idée plus intelligente sur la façon de faire cela.

Mon code actuel est ci-dessous:

var day = DateTime.Now.Day; 
var month = DateTime.Now.Month; 
var year = DateTime.Now.Year; 

switch (digits.Length) 
{ 
    case 1: 
    case 2: 
     day = int.Parse(digits.Substring(0)); 
     break; 

    case 3: 
    case 4: 
     day = int.Parse(digits.Substring(0, 2)); 
     month = int.Parse(digits.Substring(2)); 
     break; 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
     day = int.Parse(digits.Substring(0, 2)); 
     month = int.Parse(digits.Substring(2, 2)); 
     year = int.Parse(digits.Substring(4)); 
     break; 
    default: 
     break; 
} 

Note: Je sais que cela ne prend pas en considération la culture, mais il est pas censé :)

J'ai essayé de fais comme ça:

day = int.Parse(digits.Substring(0, 2)); 
if(digits.Length > 2) 
    month = int.Parse(digits.Substring(2, 2)); 
if(digits.Length > 4) 
    year = int.Parse(digits.Substring(4, 4)); 

Mais il va jeter un ArgumentOutOfRangeException si la la chaîne a 1, 3, 5, 6 ou 7 chiffres ... donc cela n'a pas marché aussi bien. Si seulement la méthode Substring aurait juste pris autant de lettres que possible au lieu d'échouer quand il n'y avait pas assez de lettres pour "remplir" la sous-chaîne ...

Est-ce que des expressions régulières peuvent être utilisées pour cela?

Répondre

7

Regardez la méthode TryParseExact.

DateTime date; 
if (DateTime.TryParseExact(
    digits, 
    new[] { "dd", "ddMM", "ddMMyyyy" }, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out date)) 
{ 
    int day = date.Day; 
    int month = date.Month; 
    int year = date.Year;  
} 
+0

Maintenant, voyez c'est génial! Jamais vraiment utilisé cette méthode avant réellement. Je vous remercie! – Svish

0

Vous pouvez obtenir votre deuxième extrait de travailler si vous pad le côté droit de la chaîne chiffres avec un peu d'espaces:

digits += " "; 
day = int.Parse(digits.Substring(0, 2)); 
if(digits.Length > 2) 
    month = int.Parse(digits.Substring(2, 2)); 
if(digits.Length > 4) 
    year = int.Parse(digits.Substring(4, 4)); 
0

Regex peut être une bonne solution. Du haut de ma tête cela pourrait ressembler:

^([0-9]{1,2})([0-9]{1,2})?([0-9]{1,4})? 

qui fournirait jusqu'à 4 groupes, indexés comme: 0 - toute la chaîne 1 - les 2 premiers chiffres (1 s'il y a seulement 1 chiffre) 2 - la deuxième paire de chiffres (1 s'il n'y a que 3 chiffres) 3 - le dernier ensemble de 1-4 chiffres

0

donc, pour le programme, les deux premiers numéros sera également un jour et non un mois de jour comme 38 jours = 3, mois = 8? Le jour serait toujours zéro pour les moins de 10 ans?

+0

À peu près. Bon point. J'aurais sans doute pu faire mieux, mais quand j'étais en train de le faire, c'était déjà un peu trop compliqué: p Comment le soutiendrait-il? Tout ce que je peux penser est une jungle très moche de déclarations if: p – Svish