2010-11-04 12 views
26

je un tableau de chaînes:C# suppression des chaînes de fin de chaîne

string[] remove = { "a", "am", "p", "pm" }; 

Et j'ai une zone de texte qu'un utilisateur saisit le texte. Si elles tapent une chaîne dans le tableau remove à la fin du texte dans la zone de texte, il doit être supprimé. Quelle est la manière la plus simple de faire ça?

EDIT Pour clarifier, je fais un analyseur de temps. Lorsque vous donnez une chaîne à la fonction, il fait de son mieux pour l'analyser dans ce format: 08:14pm J'ai une zone de texte pour le tester. Lorsque le focus quitte la zone de texte, je dois obtenir le texte sans le suffixe am/pm/a/p afin que je puisse analyser le segment de numéro seul.

+1

Quand devrait-il être retiré? Vous essayez évidemment de résoudre un dilemme temporel. Peut-être qu'il existe une meilleure façon de résoudre votre problème entièrement –

+0

Lorsque la zone de texte perd le focus, l'événement 'OnLeave'. – Entity

+1

pourquoi voulez-vous faire cela? Utiliser la liste générique – Shahin

Répondre

57
string[] remove = { "a", "am", "p", "pm" }; 
string inputText = "blalahpm"; 

foreach (string item in remove) 
    if (inputText.EndsWith(item)) 
    { 
     inputText = inputText.Substring(0, inputText.LastIndexOf(item)); 
     break; //only allow one match at most 
    } 
+0

Bingo! Merci! (Cela me fait attendre 5 minutes pour marquer cela comme réponse pour une raison quelconque ...) – Entity

+3

Une réponse correcte à la question originale. Pourtant, je dirais que si l'utilisateur a écrit 20h14, elle veut dire 20h14.Et dès que vous supprimez l'indicateur AM/PM, vous ne pouvez pas savoir si l'heure doit être analysée comme étant de 12 ou 24 heures. –

+0

si l'utilisateur a écrit 20h14, alors je le laisserai comme ça. Si elles entrent dans «814pm» alors le programme devra enlever la partie am/pm pour traiter seulement la partie de numéro. Il est ajouté avant d'être remis dans la zone de texte. – Entity

0

Cela ressemble à un bon endroit pour regex.

using System.Text.RegularExpressions; 

public bool IsValidTime(string thetime) 
{ 
    Regex checktime = new Regex(@"^(20|21|22|23|[01]\d|\d)(([:][0-5]\d){1,2})$"); 

    return checktime.IsMatch(thetime); 
} 

En supposant que vous voulez temps dans le format xx: xx

+0

Par 'd' voulez-vous dire' \ d'? – kennytm

+0

Merci, raté ça .. Je l'ai corrigé. –

9
foreach (string suffix in remove) 
{ 
    if (yourString.EndsWith(suffix)) 
    { 
     yourString = yourString.Remove(yourString.Length - suffix.Length); 
     break; 
    } 
} 
1
var output = (from x in remove 
     where input.EndsWith(x) 
    select input.Substring(0, input.Length - x.Length)).FirstOrDefault() ?? input; 
1

Vous pouvez probablement utiliser DateTime comme type primaire alors.

Utilisez DateTime.TryParse pour lire l'heure à laquelle l'utilisateur entre. Et utilisez DateTime.ToString pour reformater le temps en utilisant le format dont vous avez besoin.

+1

Et si le format exact est connu (comme hh: mmtt), DateTime.ParseExact ou DateTime.TryParseExact peut être utile. –

-1
char[] remove = { 'a', 'p', 'm' }; 
string s = "8:14pm"; 

s = s.TrimEnd(remove); 
+0

-1: Cela va changer "8: 14pamm" en "8:14", ce qui n'est pas ce que l'OP voulait. –

+0

@DanielRose: Je pense que c'est exactement ce que le PO demande. "Si elles tapent une chaîne dans le tableau remove à la fin du texte dans la zone de texte, il doit être supprimé." Et: "Je dois obtenir le texte sans le suffixe am/pm/a/p". Le PO demande spécifiquement comment obtenir juste "8:14" – ulty4life

+0

L'OP a demandé d'enlever l'am/pm (ou raccourci à un/p) de la fin. Si l'utilisateur a entré (meilleur exemple) "8: 14mmmm" alors votre solution renvoie "8:14". Mais je dirais que la chaîne est invalide, puisque "mmm" n'est pas une désignation de temps valide. –

5

Je pense que la solution de BrokenGlass est bonne, mais personnellement, je préfère créer trois méthodes distinctes permettant à l'utilisateur de rogner uniquement le début, la fin ou les deux.

Si ces gênes allaient être beaucoup utilisées, je les créerais dans une classe d'aide et/ou comme méthodes d'extension; http://msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx

public string TrimStart(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     while (!string.IsNullOrEmpty(inputText) && inputText.StartsWith(value, comparisonType)) 
     { 
      inputText = inputText.Substring(value.Length - 1); 
     } 
    } 

    return inputText; 
} 

public string TrimEnd(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     while (!string.IsNullOrEmpty(inputText) && inputText.EndsWith(value, comparisonType)) 
     { 
      inputText = inputText.Substring(0, (inputText.Length - value.Length)); 
     } 
    } 

    return inputText; 
} 

public string Trim(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase) 
{ 
    return TrimStart(TrimEnd(inputText, value, comparisonType), value, comparisonType); 
} 

Avec ces méthodes, nous pouvons modifier le code pour une boucle à travers le tableau contenant les chaînes à rogner.

var content = "08:00 AM"; 
var removeList = new [] { "a", "am", "p", "pm" }; 

for (var i = 0; i < removeList.length; i++) 
{ 
    content = TrimEnd(content, removeList[i]); 
} 

REMARQUE: Ce code pourrait être optimisé davantage, mais fonctionnera comme il le devrait avec une bonne vitesse.

+3

Je suggérerais d'en faire des extensions (utiliser 'this string inputText' comme premier argument), et par défaut de ne pas être insensible à la casse, car C# est par défaut sensible à la casse. – bradlis7