2017-02-20 6 views
3

Я пытаюсь обрезать последний символ из строки, если не номер Например: «2 + 3-4 *» Оттуда последний астрик нужно подрезать, число моего результата должно быть как «2 + 3-4». Если пользователь вводит «2 + 3 + 8», тогда нет необходимости обрезать, поскольку последний номер.Обрезка последнего символа, если не число

+1

Я не думаю, что это именно простофиля, только очень близкие. OP не обязательно знает, какой характер они ищут для обрезки, поэтому он требует немного большего интеллекта, чем просто обрезка определенного персонажа. –

+1

Я должен согласиться с @DangerZone здесь - это не обман этого вопроса. – EJoshuaS

+1

Кроме того, кажется, что есть разногласия между ответами. Что делать, если есть несколько конечных нечетных чисел? (например, «2 + 3-4 **»). Должны ли оба '*' быть удалены или только самые последние? –

ответ

4

Вы можете проверить последний символ числовой или не используется ниже фрагмент кода:

например:

string value = "4+8-4*"; 
int outInt = 0; 
bool isLastCharNumeric = int.TryParse(value[value.Length - 1].ToString(), out outInt); 
if (!isLastCharNumeric) 
{ 
    //chop off the last char 
    value = value.Remove(value.Length - 1;); 
} 
+0

Спасибо за фрагмент, он решил мою проблему –

+0

@VenkateshKonduru - Просто отметьте, что это не сработает, если вам нужно удалить несколько нечисловых символов. Это приведет к удалению последнего. –

+0

Исправьте, однако в вашем вопросе было сказано: «Я пытаюсь обрезать последний символ из строки, если не число» – SashaStojanovic

0

Вероятно, вы можете использовать регулярное выражение:

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]+$", ""); 
0

Я думаю, что регулярное выражение будет хороший чистый способ решения этой проблемы.

Regex rgx = new Regex("\D+$"); 
string result = rgx.Replace("2+3-4*", ""); 
-2

Рабочие, испытанного код

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); 
    } 
} 
+2

Зачем вам нужно проверять символ в позиции, большей длины самой строки? Это приведет к тому, что исключение будет выбрасываться каждый раз. –

+0

У меня там что-то запуталось, его непроверенный псевдокод жестко. починил это. –

2

Вы можете захватить последний символ и проверить, если это число, то удалить, если так.

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

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

Вы можете использовать это регулярное выражение: [^0-9]$, чтобы определить, если последний символ является то другой, чем число. Если регулярное выражение является совпадением, просто удалите последний символ.

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

Почему это становится больше любви, когда он просто бросает одного персонажа, и, как только вы подобрали то, что хотите, в чем смысл не использовать регулярное выражение ... Я бы понял, как другие ответчики, что его можно решить ** без ** regexps ... но зачем смешивать оба подхода? Во всяком случае, он падает только на нечисловой символ ... –

+2

@ MatíasFidemraizer - я не понимаю твое последнее предложение. Предполагается, что он должен оставить нечисловой символ в соответствии с вопросом. –

+0

@DangerZone только ** один **. –

0

Мой подход будет использовать регулярное выражение, но вместо того, чтобы использовать его для замены последний символ, я бы использовал регулярное выражение для извлечения действительной части строки. Мой подход закодирован на Java, но вы можете легко перевести его на C#.

Pattern pattern = Pattern.compile("([0-9]+)([\\+\\-\\:\\*][0-9])+"); 
Matcher m; 
String input = "++2+4+5-6*3+4*2-3--"; 
m = pattern.matcher(input); 
while(m.find()){ 
    System.out.println(m.group()); 
} 
0

Я не большой по регулярным выражениям, поскольку они довольно медленные, относительно говоря. Мы можем решить это довольно легко, указав, какие цифры есть, а затем просто проверяем, является ли последний символ одним из них. Поэтому сначала откройте, указав, что мы считаем числами.

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. 

Таким образом, наш конечный продукт выглядит следующим образом. Я инкапсулировал его в метод, поскольку это довольно самостоятельный аспект вашего кода (предположительно).

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); 
} 
1

Использование Regex:

string str= "2+3-4*"; 
str = Regex.Replace(str, "[^0-9]$", ""); 
Смежные вопросы