C#を使用して先行ゼロを削除する方法


134

C#を使用して文字列の先行ゼロを削除する方法は?

たとえば、次の数値では、すべての先行ゼロを削除したいと思います。

0001234
0000001234
00001234

3
「nvarcharデータ型」では、文字列を意味していると思います。
Ray

そして「C£」は「C#」の略です...
T30

回答:


151

上記のいくつかのメソッド(特にIntXXを介して変換するメソッド)は機能しないため、NVARCHARの長さに依存します。

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

このようなものは

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

17
strInput= "0000000";または同様の問題。これは、1つのゼロではなく空の文字列を返すためです。
avrahamcool 2014年

2
@avrahamcoolは、文字列の長さを見て"0"、トリム後に空の場合は単に返すことで処理できます。またはを使用しPadLeft(1, '0')ます。
・クール

310

これはあなたが必要とするコードです:

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

7
問題のある場合strInput= "0000000";または類似
avrahamcool 2014

@Emjayは、1つのゼロではなく空の文字列を返すためです。
avrahamcool 2014年

22
@avrahamcoolそれはまだそれがすべきことを正確にやっているでしょう。単一のゼロを返すことは例外であり、開発者が処理する必要があります。
user609926 14

12
strInput.TrimStart('0').PadLeft(1, '0');取り扱い"0000" > "0"ます。
Chris Romp、2018年

30

空の文字列を返さないようにするコード(入力が「00000」のような場合)。

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

2
文字列が非常に長いと仮定しましょう。なぜそれを2回トリミングするのでしょうか。トリミングした文字列を変数に保存できます
avrahamcool

@avrahamcool、どういう意味ですか、どこで2回トリミングされますか?コメントをありがとう。
msysmilu 2017年

ああ、@ avrahamcool、多分それが私がそれを編集した理由です:)結局、それは質問メモリ対計算時間です。今日のメモリは、この種のアプリケーションではもう問題ではないようです
msysmilu

25

return numberString.TrimStart('0');


5
問題のある場合numberString= "0000000";または類似
avrahamcool 2014

1
@msysmiluは、1つのゼロではなく空の文字列を返すためです。
avrahamcool 2014年

1
@avrahamcool正解です。Ergo iはこれを回避するための答えを提案しました
msysmilu 2014年

5

TryParseは、数値がInt32.MaxValueより小さい場合に機能します。これにより、不適切な形式の文字列を処理する機会も得られます。Int64.MaxValueおよびInt64.TryParseで同じように機能ます

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

おそらく、提起された質問に対してはやり過ぎです。これは、小数点の右側に埋め込まれたゼロの削除も可能にするため、私が探している解決策です。(Decimal.TryParse)
2014年

@JK私は投稿が古いことを知っていますが、クリーンで非常に理解しやすいので、このソリューションが本当に好きです。キーを押すイベントでテキストを変更する質問が1つだけでも、textchangedイベントが発生します-私は正しいですか?
Ken

3

この正規表現を使用すると、ゼロからのみ構成される数字「0000」の誤った結果を回避し、任意の長さの数字を処理できます。

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

そして、この正規表現は文字列内の任意の場所にある先行ゼロを削除します:

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


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
このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供することで、回答の長期的な価値が向上します。
Nic3500

@ Nic3500からの提案に従って回答を改善
バーラト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.