C# 如果不是数字,请修剪最后一个字符

C# 如果不是数字,请修剪最后一个字符,c#,C#,如果不是一个数字,我尝试从字符串中删除最后一个字符,例如:“2+3-4*”,因为它不是一个数字,所以最后一个astrik需要被删除,我的结果应该是“2+3-4”。如果用户输入“2+3+8”,则无需修剪,因为最后一个是数字。您可能可以使用正则表达式: string input = "2+3+"; // Regexp => one or more occurences of a non-numeric character at // the end of the string string s

如果不是一个数字,我尝试从字符串中删除最后一个字符,例如:“2+3-4*”,因为它不是一个数字,所以最后一个astrik需要被删除,我的结果应该是“2+3-4”。如果用户输入“2+3+8”,则无需修剪,因为最后一个是数字。

您可能可以使用正则表达式:

string input = "2+3+";
// Regexp => one or more occurences of a non-numeric character at
// the end of the string
string santizedInput = Regex.Replace(input, "[^0-9]+$", "");

我会使用正则表达式。 [^\d]+$


查看结果:

我认为正则表达式是解决这个问题的一个好方法

Regex rgx = new Regex("\D+$");
string result = rgx.Replace("2+3-4*", "");
工作、测试代码

using System;

public class Program
{
    public static void Main()
    {
        string calculation = "2+3+81%";
        int length = calculation.Length;
        if(!Char.IsNumber(calculation[length-1])){
            calculation = calculation.TrimEnd(calculation[length-1]);
        }
        Console.Write(calculation);
    }
}

您可以抓取最后一个字符并检查它是否是数字,如果是,则删除

string str = "2+3-4*";

if(!Char.IsNumber(str[str.Length - 1])){
  str = str.Remove(str.Length - 1);
}

您可以使用此正则表达式:
[^0-9]$
确定最后一个字符是否不是数字。如果正则表达式匹配,只需删除最后一个字符

string a = "abc";
if (Regex.IsMatch(a, "[^0-9]$"))
{
  a = a.Remove(a.Length - 1);
}

您可以使用以下代码段检查最后一个字符是否为数字:

例如:


我的方法是使用正则表达式,但不是使用它来替换最后一个字符,而是使用正则表达式来提取字符串的有效部分。我的方法是用Java编写的,但您可以非常轻松地将其转换为C


我不太喜欢正则表达式,因为它们相对来说相当慢。我们可以很容易地解决这个问题,方法是定义数字,然后检查最后一个字符是否是其中的一个。首先让我们指定我们认为是数字的开路。< /P>
static readonly char[] numbers = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
现在我们需要返回两个结果中的一个,这取决于最后一个字符是否是我们刚才列出的字符之一。为了实现这一点,让我们使用三元语句

var testInput = "testing5";//Testing input
var trimmedString = 
    numbers.Any(x => x == testInput[testInput.Length - 1]) ?//testInput.Length - 1 is going to give us the last character in the string
    testInput : //It's a number so go ahead and return the full string
    testInput.SubString(0, testInput.Length - 1);//It's not a number so lets return all but the last character in the string as a new string.
我们的最终产品是这样的。我将它封装到一个方法中,因为它是代码的一个非常独立的方面(大概是这样)

使用正则表达式:

string str= "2+3-4*";
str = Regex.Replace(str, "[^0-9]$", "");

我不认为这完全是一个骗局,只是高度相关。OP不一定知道他们想要修剪的角色是什么,所以它确实比修剪一个特定的角色需要更多的智慧。我必须同意这里的@DangerZone——这不是一个被愚弄的问题。而且,答案之间似乎存在分歧。如果有多个尾随的非数字怎么办?(例如,
“2+3-4**”
)。是应该同时删除
*
,还是只删除最后一个?@DangerZone就是这样,OP似乎忽略了这种情况。当OP意识到所选答案存在此问题时,可能会在一段时间内再次出现…为什么要在大于字符串本身长度的位置检查字符?这将导致每次都抛出异常。我在那里混淆了一些东西,它未经测试的伪代码很难处理。修正了它。为什么当它只删除一个字符时会得到更多的爱,并且,一旦你匹配了你想要的,不使用正则表达式替换有什么意义。。。和其他回答者一样,我会理解,它可以在没有正则表达式的情况下解决。。。但为什么要混合这两种方法呢?不管怎样,它只删除了一个非数字字符…@MatíasFidemraizer-我不明白你的最后一句话。根据问题,只能删除一个非数字字符。@DangerZone只有一个。@Matíasfidemrazier OP指定他只想删除一个字符。此外,如果需要,您可以使其匹配多个字符。@VenkateshKonduru-请注意,如果您需要删除多个非数字字符,则此操作将不起作用。这只会删除最后一个字符。请更正,但您的问题确实指出,“如果不是数字,我将尝试从字符串中删除最后一个字符”
var testInput = "testing5";//Testing input
var trimmedString = 
    numbers.Any(x => x == testInput[testInput.Length - 1]) ?//testInput.Length - 1 is going to give us the last character in the string
    testInput : //It's a number so go ahead and return the full string
    testInput.SubString(0, testInput.Length - 1);//It's not a number so lets return all but the last character in the string as a new string.
static readonly char[] numbers = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

public static string TrimNonNumbers(string input)
{
    if (string.IsNullOrEmpty(input)) return input;//Our math will produce an index out of range exception with an empty string.  So this is a safety to prevent that.
    return numbers.Any(x => x == testInput[testInput.Length - 1]) ? testInput : testInput.SubString(0, testInput.Length - 1);
}
string str= "2+3-4*";
str = Regex.Replace(str, "[^0-9]$", "");