Я пытаюсь создать приложение-калькулятор, и мне нужно иметь возможность получить последнее значение после того, как кто-то нажмет оператор (+, *, -, /) после второго раза (первое значение сохраняется без проблем, поскольку оно единственный номер на экране). Итак, если в верхней части экрана есть что-то вроде (222 * 3333/12), мне нужно получить 12. Как только я научусь это делать, я смогу выяснить, как сохранить предыдущее число / сумму, а затем выполнить вычисления на следующий номер (хотя я его еще не сделал). Я знаю, что это дурацкий способ делать вещи, и любые предложения приветствуются. Таким образом, я могу получить это число, если я использую substringAfterLast () и вставляю туда оператор, однако, если смешивать вещи и использовать несколько операторов (например, 222 * 3333/12), моя переменная y (см. Ниже) просто показывает «222 * 3333 / 12 "вместо 12. Как использовать несколько разделителей для подстроки?

Кстати, вот мой код (прости)

        multiplybutton.setOnClickListener {
            var x = numbersEntered.toString()
            var y = ""
            //creates an array that holds the operators so it can be easily filtered out
            val operators = arrayOf<Char>('*','/','+','-')
            //prevents app from crashing by saving the last value before the operator is added, allowing us to create infinite number of operations
            if (x.any(operators :: contains)){
//                x.split(operators.toString())
                
                y = x.substringAfterLast('*')  // can't use my operator character array here? why? how do I iterate through it?
                Toast.makeText(this, y.toString(), Toast.LENGTH_SHORT).show()

//                previousvalue = y.toInt()
            } else {
                previousvalue = x.toInt()
            }
            numbersEntered.append("*")
            numbersEnteredBox.setText(numbersEntered.toString())
            isMultiply = true;
            Toast.makeText(this, previousvalue.toString(), Toast.LENGTH_SHORT).show()
        }

Изменить: игнорировать курсив плз, не уверен, что пошло не так

2
actionjump 29 Авг 2020 в 09:05

2 ответа

Лучший ответ

Используйте split с регулярным выражением

Использование регулярного выражения дает вам большой контроль над разделением строки. В вашем случае все, что не является числовой цифрой, вероятно, является разделителем. Regex имеет встроенный класс символов, обозначаемый \D, который будет соответствовать любому символу, кроме цифры.

val pattern = Regex("""\D+""") // matches one or more non-digit characters
"1 * 2 / 3".split(pattern).last() // returns "3"

Точно так же вы можете создать свой собственный класс символов, используя [], чтобы уточнить, какие символы вы хотите использовать в качестве разделителей:

val pattern = Regex("""\s*[-\+*]\s*""") // matches -\+*, and any spaces around them
"1 * 2 / 3".split(pattern).last() // returns "3"
1
Sam 29 Авг 2020 в 13:07

Извините, возможно, я не совсем понимаю, что вы хотите сделать, но вы можете использовать функцию split для получения последнего числа из такой строки 222 * 3333 / 12:

println("222 * 3333 / 12".split('+', '-', '*', '/').last().trim().toInt())
// prints 12
2
Andrei Tanana 29 Авг 2020 в 07:18