如何使用C#移除前导零

184

如何使用C#去除字符串中的前导零?

例如,在以下数字中,我想要删除所有前导零。

0001234
0000001234
00001234
9个回答

381

这是你需要的代码:

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

9
strInput= "0000000"; 或类似情况时存在问题。 - avrahamcool
@Emjay 因为它会返回一个空字符串而不是一个零。 - avrahamcool
29
即使如此,它仍将按照其应有的方式执行。返回单个零将是一种异常情况,应由开发人员进行处理。 - user609926
20
strInput.TrimStart('0').PadLeft(1, '0'); 可以将 "0000" > "0" 处理成正确的结果。 - Chris Romp

180

这主要取决于NVARCHAR的长度,因为一些方法(特别是通过IntXX进行转换的方法)对以下情况无效:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

类似这样的东西

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

18
strInput="0000000" 或类似的情况时会存在问题,因为它将返回一个空字符串而不是一个零。 - avrahamcool
2
@avrahamcool 可以通过查看字符串的长度并在修剪后为空时简单地返回“0”来处理它。或者使用 PadLeft(1, '0') - Cœur
1
甚至有一個維基百科頁面談到這個問題 https://en.wikipedia.org/wiki/Leading_zero。有趣的是它說“在位置表示法中,領先零是指在數字串中第一個非零數字之前出現的任何0數字。”也就是說,從“000”中刪除前導零會得到“”,而不是“0”。我認為這是正確的,特別是如果您從函數返回字符串(如上所述,調用者可以處理空字符串並在需要時使用零)。 - bytedev

34

避免返回空字符串的代码(例如当输入为“00000”时)。

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

2
假设字符串非常长,为什么要剪裁两次?你可以将已经剪裁过的字符串保存在一个变量中。 - avrahamcool
2
@avrahamcool,你的意思是什么,它被修剪了两次?感谢您的评论。 - msysmilu
啊,@avrahamcool,也许这就是我编辑它的原因 :) 最终问题在于内存与计算时间之间的权衡;我想今天在这些应用程序中内存已经不再是一个问题了。 - msysmilu

26

返回去除首位零的数字字符串。


5
numberString="0000000"或类似情况时存在问题。 - avrahamcool
1
@msysmilu 因为它会返回空字符串而不是一个零。 - avrahamcool
1
@avrahamcool 你是对的。因此,我建议一个答案来避免这种情况。 - msysmilu

7
使用以下代码,当输入全为0时将返回单个0。
string s = "0000000"
s = int.Parse(s).ToString();

5

TryParse 可以用于小于 Int32.MaxValue 的数字。这也给了你处理格式不正确的字符串的机会。对于 Int64.MaxValueInt64.TryParse,使用方法相同。

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

或许对于所提出的问题来说有些过度,但这正是我正在寻找的解决方案,因为它还允许去除小数点右侧的零。(Decimal.TryParse) - winwaed
@JK 我知道这篇文章已经有点老了,但我真的很喜欢这个解决方案,因为它非常简洁易懂。只有一个问题,在按键事件中更改文本也会触发文本更改事件 - 我是正确的吗? - Ken

4

这个正则表达式可以避免在只由零组成的数字"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的建议改进了答案。 - Bharat

-2

我只是按照需要寻找一个好的、简单的方式来完成这个。

如果他们到了最后一位数字,若是0就会保留下来。

你也可以使用 foreach 循环来处理超长字符串。

我只是用新字符替换每个前导旧字符。


这对我刚解决的一个问题非常有用,即将int格式化为字符串。

    /* Like this: */
    int counterMax = 1000;
    int counter = ...;
    string counterString = counter.ToString($"D{counterMax.ToString().Length}");
    counterString = RemoveLeadingChars('0', ' ', counterString);
    string fullCounter = $"({counterString}/{counterMax})";
    // = (   1/1000) ... ( 430/1000) ... (1000/1000)

    static string RemoveLeadingChars(char oldChar, char newChar, char[] chars)
    {
        string result = "";
        bool stop = false;
        for (int i = 0; i < chars.Length; i++)
        {
            if (i == (chars.Length - 1)) stop = true;
            if (!stop && chars[i] == oldChar) chars[i] = newChar;
            else stop = true;
            result += chars[i];
        }
        return result;
    }

    static string RemoveLeadingChars(char oldChar, char newChar, string text)
    {
        return RemoveLeadingChars(oldChar, newChar, text.ToCharArray());
    }

我总是倾向于使我的函数适合于我的库,因此有多种选择。


重新发明轮子很少是一个好选择。你的代码不如简单的 string.TrimStart() 容易阅读,也可能存在更多的错误。 - C.Champagne
嗨。对于我使用的这个问题,TrimStart也存在同样多的问题。它不会告诉你有多少被删除了,所以你不能用字符计数来创建新字符串。重点是替换,而不是修剪。一个真正的替代方法是使用for循环并计算有多少个零,然后进行TrimStart,最后再用字符计数创建新字符串。无论如何,还是谢谢。 - Luke Nukem
已经过去了2年,所以我的备选方案可能是将我的API转换为什么。再次感谢。 - Luke Nukem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接