Cómo eliminar los ceros a la izquierda con C #

134

¿Cómo eliminar los ceros a la izquierda en cadenas usando C #?

Por ejemplo, en los siguientes números, me gustaría eliminar todos los ceros a la izquierda.

0001234
0000001234
00001234
Coeur
fuente
3
por 'nvarchar datatype' supongo que te refieres a string.
Ray
Y 'C £' significa 'C #' ...
T30

Respuestas:

151

Realmente depende de cuánto dura el NVARCHAR, ya que algunos de los métodos anteriores (especialmente los que se convierten a través de IntXX) no funcionarán para:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Algo como esto

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"
Golpe maestro
fuente
17
problemático cuando strInput= "0000000";o similar. porque devolverá una cadena vacía en lugar de un cero.
avrahamcool
2
@avrahamcool, que se puede manejar mirando la longitud de la cadena y simplemente regresando "0"si está vacía después del corte. O el uso PadLeft(1, '0').
Cœur
310

Este es el código que necesitas:

string strInput = "0001234";
strInput = strInput.TrimStart('0');
Craig Hannon
fuente
77
problemático cuando strInput= "0000000";o similar
avrahamcool
@Emjay porque devolverá una cadena vacía en lugar de un cero.
avrahamcool
22
@avrahamcool todavía estaría haciendo exactamente lo que debería. Devolver un solo cero sería una excepción y debería ser manejado por el desarrollador.
user609926
12
strInput.TrimStart('0').PadLeft(1, '0');se encargará "0000" > "0".
Chris Romp
30

Código para evitar devolver una cadena vacía (cuando la entrada es como "00000").

string myStr = "00012345";
myStr = myStr.TrimStart('0');
myStr = myStr.Length > 0 ? myStr : "0";
msysmilu
fuente
2
supongamos que la cuerda es muy larga, ¿por qué cortarla dos veces? puede guardar la cadena recortada en una variable
avrahamcool
@avrahamcool, ¿qué quieres decir, dónde se recorta dos veces? Gracias por el comentario.
msysmilu
ah, @avrahamcool, tal vez por eso lo edité :) al final es una memoria de preguntas vs tiempo de cálculo; Supongo que hoy la memoria ya no es un problema en este tipo de aplicaciones
msysmilu
25

return numberString.TrimStart('0');

Rayo
fuente
55
problemático cuando numberString= "0000000";o similar
avrahamcool
1
@msysmilu porque devolverá una cadena vacía en lugar de un cero.
avrahamcool
1
@avrahamcool Tienes razón. Ergo, sugerí una respuesta para evitar esto
msysmilu
5

TryParse funciona si su número es menor que Int32.MaxValue . Esto también le da la oportunidad de manejar cadenas mal formateadas. Funciona igual para Int64.MaxValue e Int64 . TryParse .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}
JK
fuente
Tal vez exagere para la pregunta planteada, esta es la solución que estoy buscando, ya que también permite la eliminación de ceros a la derecha para decimales. (Decimal. TryParse)
winwaed
@JK Sé que la publicación es antigua, pero realmente me gusta esta solución, ya que es limpia y muy fácil de entender. Solo una pregunta que cambie el texto en un evento de pulsación de tecla también activará el evento de cambio de texto: ¿estoy en lo correcto?
Ken
3

Esta expresión regular le permite evitar resultados incorrectos con dígitos que consisten solo en ceros "0000" y funcionan en dígitos de cualquier longitud:

using System.Text.RegularExpressions;

/*
00123 => 123
00000 => 0
00000a => 0a
00001a => 1a
00001a => 1a
0000132423423424565443546546356546454654633333a => 132423423424565443546546356546454654633333a
*/

Regex removeLeadingZeroesReg = new Regex(@"^0+(?=\d)");
var strs = new string[]
{
    "00123",
    "00000",
    "00000a",
    "00001a",
    "00001a",
    "0000132423423424565443546546356546454654633333a",
};
foreach (string str in strs)
{
    Debug.Print(string.Format("{0} => {1}", str, removeLeadingZeroesReg.Replace(str, "")));
}

Y esta expresión regular eliminará los ceros a la izquierda en cualquier lugar dentro de la cadena:

new Regex(@"(?<!\d)0+(?=\d)");
//  "0000123432 d=0 p=002 3?0574 m=600"
//     => "123432 d=0 p=2 3?574 m=600"
dNP
fuente
2

El uso de lo siguiente devolverá un solo 0 cuando la entrada sea todo 0.

string s = "0000000"
s = int.Parse(s).ToString();
Deependra Mishra
fuente
0
Regex rx = new Regex(@"^0+(\d+)$");
rx.Replace("0001234", @"$1"); // => "1234"
rx.Replace("0001234000", @"$1"); // => "1234000"
rx.Replace("000", @"$1"); // => "0" (TrimStart will convert this to "")

// usage
var outString = rx.Replace(inputString, @"$1");
Bharat
fuente
55
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Nic3500
Se mejoró la respuesta según la sugerencia de @ Nic3500
Bharat