如何将多个分隔符传递给子字符串 (Kotlin/Android)?
How to pass multiple delimiters to a substring (Kotlin/Android)?
我正在尝试制作一个计算器应用程序,我需要能够在有人第二次按下运算符 (+,*,-,/) 后获得最后一个值(第一个值被保存没有问题,因为它是屏幕上唯一的数字)。
所以如果屏幕顶部有类似 (222 * 3333 / 12) 的东西,我需要得到 12。一旦我学会了如何做,我就能弄清楚如何保存之前的 number/sum,然后进行计算在下一个数字上(虽然我还没有制作那部分)。
我知道这是一种简陋的做事方式,欢迎提出任何建议。
因此,如果我使用 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()
}
编辑:请忽略斜体,不知道哪里出了问题
抱歉,也许我不完全明白你想做什么,但你可以使用 split
函数从字符串中获取最后一个数字,如下所示 222 * 3333 / 12
:
println("222 * 3333 / 12".split('+', '-', '*', '/').last().trim().toInt())
// prints 12
将split
与正则表达式一起使用
使用正则表达式可以很好地控制字符串的拆分方式。在您的情况下,任何不是数字的东西都可能是定界符。正则表达式有一个 built-in 字符 class,用 \D
表示,它将匹配任何不是数字的字符。
val pattern = Regex("""\D+""") // matches one or more non-digit characters
"1 * 2 / 3".split(pattern).last() // returns "3"
同样,您可以使用 []
创建自己的字符 class,以更具体地说明您希望将哪些字符用作分隔符:
val pattern = Regex("""\s*[-\+*]\s*""") // matches -\+*, and any spaces around them
"1 * 2 / 3".split(pattern).last() // returns "3"
我正在尝试制作一个计算器应用程序,我需要能够在有人第二次按下运算符 (+,*,-,/) 后获得最后一个值(第一个值被保存没有问题,因为它是屏幕上唯一的数字)。 所以如果屏幕顶部有类似 (222 * 3333 / 12) 的东西,我需要得到 12。一旦我学会了如何做,我就能弄清楚如何保存之前的 number/sum,然后进行计算在下一个数字上(虽然我还没有制作那部分)。 我知道这是一种简陋的做事方式,欢迎提出任何建议。 因此,如果我使用 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()
}
编辑:请忽略斜体,不知道哪里出了问题
抱歉,也许我不完全明白你想做什么,但你可以使用 split
函数从字符串中获取最后一个数字,如下所示 222 * 3333 / 12
:
println("222 * 3333 / 12".split('+', '-', '*', '/').last().trim().toInt())
// prints 12
将split
与正则表达式一起使用
使用正则表达式可以很好地控制字符串的拆分方式。在您的情况下,任何不是数字的东西都可能是定界符。正则表达式有一个 built-in 字符 class,用 \D
表示,它将匹配任何不是数字的字符。
val pattern = Regex("""\D+""") // matches one or more non-digit characters
"1 * 2 / 3".split(pattern).last() // returns "3"
同样,您可以使用 []
创建自己的字符 class,以更具体地说明您希望将哪些字符用作分隔符:
val pattern = Regex("""\s*[-\+*]\s*""") // matches -\+*, and any spaces around them
"1 * 2 / 3".split(pattern).last() // returns "3"