如何使用 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# 删除前导零的主要内容,如果未能解决你的问题,请参考以下文章