Como remover zeros à esquerda usando C #


134

Como remover zeros à esquerda em seqüências de caracteres usando C #?

Por exemplo, nos números a seguir, eu gostaria de remover todos os zeros à esquerda.

0001234
0000001234
00001234

3
por 'nvarchar datatype' Suponho que você queira dizer string.
Ray

E 'C £' significa 'C #' ...
T30

Respostas:


151

Realmente depende de quanto tempo o NVARCHAR é, pois alguns dos métodos acima (especialmente os que são convertidos através do IntXX) não funcionam:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

Algo assim faria

String s ="0000058757843950000120465875468465874567456745674000004000".TrimStart(new Char[] { '0' } );
// s = "58757843950000120465875468465874567456745674000004000"

17
problemático quando strInput= "0000000";ou similar. porque retornará uma string vazia em vez de um zero.
Avrahamcool #

2
@avrahamcool, que pode ser manipulado observando o comprimento da corda e retornando simplesmente "0"se estiver vazio após o corte. Ou usando PadLeft(1, '0').
Cœur

310

Este é o código que você precisa:

string strInput = "0001234";
strInput = strInput.TrimStart('0');

7
problemático quando strInput= "0000000";ou similar
avrahamcool

@Emjay porque retornará uma string vazia em vez de um zero.
avrahamcool

22
@avrahamcool ainda estaria fazendo exatamente o que deveria. Retornar um único zero seria uma exceção e deve ser tratado pelo desenvolvedor.
user609926

12
strInput.TrimStart('0').PadLeft(1, '0');vai lidar "0000" > "0".
Chris Romp

30

Código para evitar retornar uma string vazia (quando a entrada é como "00000").

string myStr = "00012345";
myStr = myStr.TrimStart('0');
myStr = myStr.Length > 0 ? myStr : "0";

2
vamos supor que a string seja muito longa, por que apará-la duas vezes? você pode salvar a corda cortada em uma variável
avrahamcool

@avrahamcool, como assim, onde é aparado duas vezes? Obrigado pelo comentário.
msysmilu

ah, @avrahamcool, talvez seja por isso que eu editei :) no final, é uma questão de memória versus tempo de computação; eu acho que hoje a memória não é um problema mais nestes tipos de aplicações
msysmilu

25

return numberString.TrimStart('0');


5
problemático quando numberString= "0000000";ou similar
avrahamcool

1
@msysmilu porque retornará uma string vazia em vez de um zero.
avrahamcool

1
@avrahamcool Você está certo.
Portanto

5

TryParse funciona se seu número for menor que Int32.MaxValue . Isso também oferece a oportunidade de lidar com seqüências de caracteres mal formatadas. Funciona da mesma forma para Int64.MaxValue e Int64.TryParse .

int number;
if(Int32.TryParse(nvarchar, out number))
{
   // etc...
   number.ToString();
}

Talvez exagere na pergunta, essa é a solução que estou procurando, pois também permite a remoção de zeros à direita para decimais. (Decimal.TryParse)
winwaed

@JK Eu sei que o post é antigo, mas eu realmente gosto dessa solução, pois é limpa e muito fácil de entender. Apenas uma pergunta que altera o texto em um evento de pressionamento de tecla também dispara o evento de alteração de texto - estou correto?
Ken

3

Esse Regex permite evitar resultados errados com dígitos que consitem apenas dos zeros "0000" e trabalhar com dígitos de qualquer tamanho:

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, "")));
}

E esse regex removerá os zeros à esquerda em qualquer lugar dentro da string:

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

2

Usar o seguinte retornará um único 0 quando a entrada for toda 0.

string s = "0000000"
s = int.Parse(s).ToString();

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");

5
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
precisa saber é o seguinte

Melhorada a resposta conforme sugestão de @ Nic3500
Bharat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.