2011-07-27 14 views
5

Me gustaría agregar un cierto número de ceros a un número en una cadena. Por ejemplo:En C#, ¿cómo puedo usar Regex.Replace para agregar ceros a la izquierda (si es posible)?

de entrada: "página 1", la salida: "página 001" de entrada: "página 12", salida de la señal: "página 012" de entrada: "página 123", salida de la señal: "página 123"

¿Cuál es la mejor manera de hacer esto con Regex.Replace?

En este momento yo uso esto, pero los resultados son 001, 0012, 00123.

string sInput = "page 1"; 
sInput = Regex.Replace(sInput,@"\d+",@"00$&"); 
+0

Pregunta similar: http://stackoverflow.com/questions/2659058/using-regex -to-add-leading-zeroes –

+1

Lo vi pero no es similar para mí. Intento hacer eso con C# y Regex. Reemplazar solo si es posible. –

Respuesta

11

Regex expresiones de sustitución no se pueden utilizar para este propósito. Sin embargo, Regex.Replace tiene una sobrecarga que tiene un delegado que le permite hacer un procesamiento personalizado para el reemplazo. En este caso, estoy buscando todos los valores numéricos y reemplazándolos con el mismo valor rellenado a tres caracteres de longitud.

string input = "Page 1"; 
string result = Regex.Replace(input, @"\d+", m => m.Value.PadLeft(3, '0')); 

En una nota al margen, no recomiendo usar prefijos húngaros en el código C#. No ofrecen ventajas reales y las guías de estilo comunes para .Net desaconsejan su uso.

+0

"prefijos húngaros en código C#" - Dile eso a mi jefe ... –

+0

@ebyrob: tal vez mostrar [este documento] (http://msdn.microsoft.com/en-us/library/ms229045%28v= vs.100% 29.aspx) a su jefe. Es la documentación oficial de Microsoft, donde leemos "No use la notación húngara. La notación húngara es la práctica de incluir un prefijo en los identificadores para codificar algunos metadatos sobre el parámetro, como el tipo de datos del identificador". Si él no te escucha, ¿quizás escuchará a los creadores de la herramienta que usas? :) –

+0

@PawelKrakowiak estado allí hecho eso ... (Para su crédito, estamos en un ambiente mixto, pero aún así). Fue lo máximo que pude hacer para darle un poco de educación en sistemas vs aplicaciones húngaras. –

2
var result = Regex.Replace(sInput, @"\d+", m => int.Parse(m.Value).ToString("00#")); 
+0

Aunque probablemente no sea un problema en este caso particular, este código tiene el peligro de que genere una excepción si la cadena de entrada contiene una secuencia de dígitos cuyo valor es mayor que 'Int32.MaxValue'. – Sven

+0

@Sven, en el contexto de las páginas creo que es una afirmación dudosa :-) –

+1

Por eso dije que no creía que fuera un problema en este caso. Solo lo señalo en caso de que alguien en el futuro vea este código y quiera usarlo para otra cosa. :) – Sven

4

Utilice una llamada de retorno para la sustitución, y el método String.PadLeft para rellenar los dígitos:

string input = "page 1"; 
input = Regex.Replace(input, @"\d+", m => m.Value.PadLeft(3, '0')); 
+0

Existe una respuesta similar. –

+0

@Kirill Polishchuk: Sí, y todas ellas se publican o editan después de la mía. – Guffa

0
string sInput = "page 1 followed by page 12 and finally page 123"; 

string sOutput = Regex.Replace(sInput, "[0-9]{1,2}", m => int.Parse(m.Value).ToString("000")); 
0
string sInput = "page 1"; 
//sInput = Regex.Replace(sInput, @"\d+", @"00$&"); 
string result = Regex.Replace(sInput, @"\d+", me => 
{ 
    return int.Parse(me.Value).ToString("000"); 
}); 
Cuestiones relacionadas