J'ai un tableau de chaînes:
string[] remove = { "a", "am", "p", "pm" };
Et j'ai une zone de texte dans laquelle un utilisateur entre du texte. S'ils tapent une chaîne dans le tableau remove
à la fin du texte dans la zone de texte, elle doit être supprimée. Quelle est la manière la plus simple de faire ça?
EDIT Pour clarifier, je fais un analyseur de temps. Lorsque vous donnez à la fonction une chaîne, elle 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, j'ai besoin d'obtenir le texte sans le suffixe am/pm/a/p pour pouvoir analyser le segment uniquement numérique.
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
}
foreach (string suffix in remove)
{
if (yourString.EndsWith(suffix))
{
yourString = yourString.Remove(yourString.Length - suffix.Length);
break;
}
}
Je pense que la solution de BrokenGlass est une bonne solution, mais personnellement, je préférerais créer trois méthodes distinctes permettant à l'utilisateur de couper uniquement le début, la fin ou les deux.
Si ces dérangements devaient être beaucoup utilisés, je les créerais dans une classe d'assistance 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 parcourir le tableau contenant les chaînes à couper.
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 tel quel avec une bonne vitesse.
En fonction de votre modification, envisagez d'utiliser les méthodes intégrées DateTime.TryParse ou DateTime.Parse suivies d'un String.Format. Voici un lien vers un bonne ressource sur la mise en forme des chaînes également.
Vous pouvez alors probablement utiliser DateTime
comme type principal.
Utilisation DateTime.TryParse
pour lire l'heure de saisie de l'utilisateur. Et utilise DateTime.ToString
pour reformater l'heure en utilisant le format dont vous avez besoin.
Sonne comme 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 vouliez du temps au format xx: xx
var output = (from x in remove
where input.EndsWith(x)
select input.Substring(0, input.Length - x.Length)).FirstOrDefault() ?? input;
char[] remove = { 'a', 'p', 'm' };
string s = "8:14pm";
s = s.TrimEnd(remove);