如何在C#中实现SQL Server式的去除前导字符与零的功能?
实现SQL中去除前导非数字和零的C#代码
嘿,我来帮你把这个SQL逻辑转换成C#代码!你的SQL语句核心是找到字符串中第一个非零数字(1-9)的位置,然后从该位置开始截取到字符串末尾,以此去掉前面的非数字字符和所有前导零。下面给你两种简洁的实现方式:
方法一:手动遍历字符(直观易懂)
这种方式和SQL的逻辑最贴近,逐个字符查找第一个非零数字的位置,然后截取剩余部分:
public static string CleanDeliveryNumber(string deliveryNo) { if (string.IsNullOrWhiteSpace(deliveryNo)) return string.Empty; int firstNonZeroDigitIndex = -1; for (int i = 0; i < deliveryNo.Length; i++) { char currentChar = deliveryNo[i]; // 找到第一个1-9的字符 if (currentChar >= '1' && currentChar <= '9') { firstNonZeroDigitIndex = i; break; } } // 如果没有找到非零数字,返回空(和SQL逻辑一致);如果需要返回"0"可自行调整 if (firstNonZeroDigitIndex == -1) return string.Empty; // 从第一个非零数字位置开始截取到末尾 return deliveryNo.Substring(firstNonZeroDigitIndex); }
测试示例:
Console.WriteLine(CleanDeliveryNumber("ABC-000001")); // 输出: "1" Console.WriteLine(CleanDeliveryNumber("CDE-000026")); // 输出: "26" Console.WriteLine(CleanDeliveryNumber("XYZ-00012-78")); // 输出: "12-78"
方法二:正则表达式(简洁高效)
用正则表达式直接匹配从第一个非零数字开始到结尾的所有内容,代码更简洁:
public static string CleanDeliveryNumber(string deliveryNo) { if (string.IsNullOrWhiteSpace(deliveryNo)) return string.Empty; // 正则匹配第一个非零数字及后面的所有字符 var match = System.Text.RegularExpressions.Regex.Match(deliveryNo, @"[1-9].*"); return match.Success ? match.Value : string.Empty; }
这个正则表达式@"[1-9].*"的意思是:找到第一个出现的1-9字符,然后匹配该字符之后的所有内容(包括非数字字符),完全对应你的SQL逻辑。
边界情况处理
如果遇到全是零或没有数字的输入(比如"000000"或"ABC-DEF"),上面的代码会返回空字符串,和SQL中PATINDEX找不到匹配项时的结果一致。如果你希望这种情况返回"0",可以在代码中添加额外判断:
比如在手动遍历的方法里修改返回逻辑:
if (firstNonZeroDigitIndex == -1) { // 如果字符串包含零,返回"0",否则返回空 return deliveryNo.Contains('0') ? "0" : string.Empty; }
内容的提问来源于stack exchange,提问作者Cát Tường Vy
相关产品推荐
相关产品推荐

