如何使用 C# 删除前导零

Posted

技术标签:

【中文标题】如何使用 C# 删除前导零【英文标题】:How to remove leading zeros using C# 【发布时间】:2011-08-10 12:23:19 【问题描述】:

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

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

0001234
0000001234
00001234

【问题讨论】:

【参考方案1】:

这是您需要的代码:

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

【讨论】:

strInput= "0000000"; 或类似时出现问题 @Emjay 因为它将返回一个空字符串而不是一个零。 @avrahamcool 它仍然会做它应该做的事情。返回单个零将是一个例外,应由开发人员处理。 strInput.TrimStart('0').PadLeft(1, '0'); 将处理 "0000" > "0"【参考方案2】:

这实际上取决于 NVARCHAR 的长度,因为上面的一些方法(尤其是通过 IntXX 转换的方法)不适用于:

String s = "005780327584329067506780657065786378061754654532164953264952469215462934562914562194562149516249516294563219437859043758430587066748932647329814687194673219673294677438907385032758065763278963247982360675680570678407806473296472036454612945621946";

这样的事情

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

【讨论】:

strInput= "0000000"; 或类似时出现问题。因为它将返回一个空字符串而不是一个零。 @avrahamcool 可以通过查看字符串的长度来处理,如果修剪后为空,则只需返回 "0"。或使用PadLeft(1, '0') en.wikipedia.org/wiki/Leading_zero 上甚至还有一个***页面。有趣的是它说“前导零是位置符号中数字字符串中第一个非零数字之前的任何 0 数字。”。即从“000”中删除前导零会给你“”而不是“0”。我会说这是真的,特别是如果您从函数返回一个字符串(如前所述,调用者可以处理空字符串并在需要时使用零)。【参考方案3】:

避免返回空字符串的代码(当输入类似于“00000”时)。

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

【讨论】:

假设字符串很长,为什么要修剪两次?您可以将修剪后的字符串保存在变量中 @avrahamcool,你是什么意思,它在哪里修剪了两次?感谢您的评论。 啊,@avrahamcool,也许这就是我编辑它的原因:) 最后这是一个内存与计算时间的问题;我想今天在这类应用程序中内存不再是问题【参考方案4】:

return numberString.TrimStart('0');

【讨论】:

numberString= "0000000"; 或类似时出现问题 @msysmilu 因为它将返回一个空字符串而不是一个零。 @avrahamcool 你是对的。因此,我建议了一个避免这种情况的答案【参考方案5】:

TryParse 在您的号码小于Int32.MaxValue 时有效。这也使您有机会处理格式错误的字符串。 Int64.MaxValue 和 Int64.TryParse 的工作方式相同。

int number;
if(Int32.TryParse(nvarchar, out number))

   // etc...
   number.ToString();

【讨论】:

对于提出的问题可能有点矫枉过正,这是我正在寻找的解决方案,因为它还允许删除小数的右填充零。 (十进制.TryParse) @JK 我知道这篇文章很旧,但我真的很喜欢这个解决方案,因为它很干净而且很容易理解。在按键事件中更改文本的一个问题也会触发 textchanged 事件 - 我正确吗?【参考方案6】:

当输入全为 0 时,使用以下将返回单个 0。

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

【讨论】:

【参考方案7】:

此正则表达式可让您避免仅由零“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"

【讨论】:

【参考方案8】:
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");

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。 根据@Nic3500 的建议改进了答案【参考方案9】:

我只是制作了这个,因为我需要一个好的、简单的方法。

如果它到达最后一位,如果它是零,它将保持不变。

您也可以使用 foreach 循环来代替超长字符串。

我只是将每个前导 oldChar 替换为 newChar。


这对于我刚刚解决的问题非常有用,在将 int 格式化为字符串之后。

    /* Like this: */
    int counterMax = 1000;
    int counter = ...;
    string counterString = counter.ToString($"DcounterMax.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());
    

我总是倾向于让我的函数适合我自己的库,所以有很多选择。

【讨论】:

以上是关于如何使用 C# 删除前导零的主要内容,如果未能解决你的问题,请参考以下文章

使用c#导入excel文档时如何防止前导零被剥离

如何使用 C++ 从字符串中删除前导零?

如何从字母数字文本中删除前导零?

使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?

如何删除字符串中的前导零和尾随零? Python

如何从浮点值Swift 3中删除前导零