2017-07-03 2 views
2

Je ne sais pas quel est ce format appelé 2d30m en langage de programmation. Mais, je vois un plugin JQuery ou le saut de Youtube à l'URL de temps comme &t=3m11s en utilisant ce format de temps. C'est difficile de google parce que je ne connais pas le mot clé excat. Donc, je veux utiliser ce type de format et traduit en objet TimeSpan en C#. Comment puis-je atteindre cet objectif?Comment changer un format de chaîne comme 2d30m en timespan?

En ce moment je suis en train d'extraire la valeur de chaîne par ce code

public static void Main() 
{ 
    String str = "2d30m"; 
    int day = 0, minute = 0; 
    //Get Day 
    day = Helper(str, "d"); 
    //Get Minute 
    minute = Helper(str, "m"); 
    //Create timespan 
    var myTimeSpan = new TimeSpan(days: day, hours: 0, minutes: minute, seconds: 0); 
    Console.Write(myTimeSpan); 
} 

public static int Helper(string input, string timeCode) 
{ 
    int output = 0; 
    int indexOf = input.LastIndexOf(timeCode, StringComparison.OrdinalIgnoreCase); 
    if (indexOf > 0) 
    { 
     string strTime = input.Substring(Math.Max(0, indexOf - 2), 2); 
     Console.WriteLine(strTime); 
     strTime = System.Text.RegularExpressions.Regex.Replace(strTime, "[^0-9.]", ""); // remove all alphabet 
     output = Convert.ToInt32(strTime); 
    } 

    return output; 
} 

Répondre

3

Vous pouvez utiliser TimeSpan.ParseExact:

var str = "2d30m"; 
// d matches both 1 and 2 digit days 
// \d means literal "d" 
// m matches both 1 and 2 digit minutes 
// \m is literal "m" 
var timeSpan = TimeSpan.ParseExact(str, @"d\dm\m", CultureInfo.InvariantCulture); 
+0

Ce [violon] (https://dotnetfiddle.net/OYi053) montre cela fonctionne. Belle solution! – FrankerZ

+0

Cela ne fonctionne pas si j'essaie d'entrer trois chiffres minutes, ie "2d120m" – vantian

+0

@vantian oui malheureusement c'est la limitation des méthodes d'analyse de timespan - il n'accepte pas les valeurs qui ne correspondent pas à la gamme de composants cible (0-24 pendant des heures, 0-60 pour les minutes et les secondes). – Evk

2

Il suffit d'utiliser Regex.Match contre la chaîne entière. assez facile d'obtenir les groupes:

public static void Main() 
{ 
    var str = "2d30m"; 
    //Regex match and find the 2 & 30 
    var matches = Regex.Match(@"^(\d+)d(\d+)m$", str); 
    //Get Day 
    var day = int.Parse(matches.Groups[1].Value); 
    //Get Minute 
    var minute = int.Parse(matches.Groups[2].Value); 
    //Create timespan 
    var myTimeSpan = new TimeSpan(days: day, hours: 0, minutes: minute, seconds: 0); 
    Console.Write(myTimeSpan); 
} 

Voir dotnetfiddle ici.

+0

Impressionnant, il est des œuvres. cela vous dérange-t-il d'expliquer ce que regex fait dans le code? – vantian

+0

@vantian Consultez la section des explications en haut à droite [ici] (https://regex101.com/r/Qi3L9m/1). – FrankerZ

+0

l'ai obtenu, je sais juste si nous pouvons utiliser des groupes de tableaux de regex. Apprendre quelque chose de nouveau chaque jour. – vantian