2010-11-04 5 views
26

tengo una matriz de cadenas:C# eliminación de las cadenas de final de cadena

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

Y tengo un cuadro de texto que un usuario introduce texto. Si escriben cualquier cadena en la matriz remove al final del texto en el cuadro de texto, debe eliminarse. ¿Cuál es la forma más fácil de hacer esto?

EDITAR Para aclarar, estoy haciendo un analizador de tiempo. Cuando le da una cadena a la función, hace todo lo posible para analizarlo en este formato: 08:14pm Tengo un cuadro de texto para probarlo. Cuando el foco abandona el cuadro de texto, necesito obtener el texto sin el sufijo am/pm/a/p para poder analizar el segmento de solo número.

+1

¿Cuándo debería eliminarse? Obviamente estás tratando de resolver un dilema del tiempo. Tal vez hay una forma mejor de resolver tu problema por completo –

+0

Cuando el cuadro de texto pierde el foco, el evento 'OnLeave'. – Entity

+1

¿Por qué quieres hacer esto? Use la lista genérica – Shahin

Respuesta

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! ¡Gracias! (Me hace esperar 5 minutos para marcar esto como respuesta por alguna razón ...) – Entity

+3

Una respuesta correcta a la pregunta original. Aún así, yo diría que si el usuario ha escrito a las 08:14 p.m., ella quiere decir 20:14.Y tan pronto como elimine el designador AM/PM, no podrá saber si el tiempo debe analizarse como de 12 o 24 horas. –

+0

si el usuario ha escrito 08:14 pm, entonces lo dejaré así. Si ingresan '814pm', el programa deberá quitar la parte am/pm para procesar solo la parte del número. Se vuelve a agregar antes de volver a colocarse en el cuadro de texto. – Entity

0

Suena como un buen lugar para 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); 
} 

Suponiendo que desee hora en el formato xx: xx

+0

¿Por 'd' quieres decir' \ d'? – kennytm

+0

Gracias, lo eché de menos ... Lo corregí. –

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

Probablemente puede utilizar DateTime como su tipo principal a continuación.

Usa DateTime.TryParse para leer la hora que el usuario ingresa. Y use DateTime.ToString para reformatear la hora usando el formato que necesite.

+1

Y si se conoce el formato exacto (como hh: mmtt), DateTime.ParseExact o DateTime.TryParseExact pueden ser útiles. –

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

s = s.TrimEnd(remove); 
+0

-1: Esto cambiará "8: 14pamm" a "8:14", que no es lo que el OP quería. –

+0

@DanielRose: Creo que esto es exactamente lo que pide el OP. "Si escriben cualquier cadena en la matriz de eliminación al final del texto en el cuadro de texto, debería eliminarse". Y: "Necesito obtener el texto sin el sufijo am/pm/a/p". El OP pregunta específicamente cómo obtener solo "8:14" – ulty4life

+0

El OP pidió que se elimine la am/pm (o se acorta a a/p) desde el final. Si el usuario ingresó (mejor ejemplo) "8: 14mmmm", su solución arrojará "8:14". Pero yo diría que la cadena no es válida, ya que "mmm" no es una designación de tiempo válida. –

5

creo que la solución de BrokenGlass es buena, pero personalmente preferiría crear tres métodos diferentes que permiten al usuario recortar sólo el principio, al final o en ambos.

Si estas incidencias se iban a utilizar mucho, las crearía en una clase de ayuda y/o como métodos de extensión; 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); 
} 

Con estos métodos se puede modificar el código para bucle a través de la matriz que contiene las cadenas que ser recortado.

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

NOTA: Este código podría optimizarse aún más, pero funcionará como lo hace a una buena velocidad.

+3

Sugiero que sean extensiones (use 'this string inputText' como primer argumento), y de forma predeterminada no sea sensible a mayúsculas y minúsculas, ya que C# se establece de manera predeterminada en mayúsculas y minúsculas. – bradlis7

Cuestiones relacionadas