Kotlin передать строку с экранированным знаком доллара - PullRequest
0 голосов
/ 27 сентября 2018

В нашем проекте я хочу передать строку со знаком доллара.Конечный результат должен выглядеть так: ~ $1300.Но я получаю только ~, остальное не распечатывается.Отладкой я обнаружил, что проблема в знаке доллара.Как я могу передать строки со знаком доллара?Экранирование знака доллара не решило эту проблему.

fun setItem() {
   bind(valueSubtitle = "~ \$${trx.currencyAmount}")
        }
fun bind(valueSubtitle: String? = null) {
        val valueSubtitleTextView = findViewById(R.id.txtValueSubtitle)
        valueSubtitleTextView.text = valueSubtitle
    }

У меня нет проблем с прямой печатью строки со знаком доллара.У меня есть проблема, когда я пытаюсь передать эту строку другой функции, и только затем распечатать ее.

Обновление Я отладил и обнаружил, что у меня есть проблема, когда мой номер имеет двойной ноль вконец: 189.00 or 123.00.Эти цифры вызывают проблемы.Другой номер, такой как 123.40 or 1152.90, показывает правильно.

Обновление 2 Проблема была с моим TextView.Он вел себя странно, когда печатал разные двойные числа.Это было решено, когда я изменил android:layout_width="match_parent" на android:layout_width="wrap_content"

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018

Нет ничего плохого в коде, который вы показали.Также обратите внимание, что вы можете использовать несколько способов избежать знака доллара и что в вашем конкретном случае вам даже не нужно его избегать.Просто сравните со следующим примером кода:

data class Container(val amount : Double = 123.00)
fun main() { // used Kotlin 1.3
  val trx = Container()
  listOf("~ \$${trx.amount}", // your variant
         "~ $${trx.amount}", // easier and works too
         """~ $${trx.amount}""", // everything in this string must not be escaped
         "~ ${'$'}${trx.amount}", // actually you may only use this if you require something like shown below (e.g. if you want to print something like $none)
         """~ ${"$"}${trx.amount}""", // similar to the one before
         // variants to print $none:
         "~ \$none",
         "~ ${'$'}none",
         """~ ${'$'}none""",
         """~ $${""}none"""
      )
      .forEach(::println)
}

Вывод приведенного выше:

~ $123.0
~ $123.0
~ $123.0
~ $123.0
~ $123.0
~ $none
~ $none
~ $none
~ $none

Но ни один из этих ответов не стал решением вашей проблемы.Поскольку $ в вашем коде не было проблемой, как вы узнали сами ...

0 голосов
/ 27 сентября 2018

Это должно работать.

fun main(args: Array<String>) {
    val dollar = "~$"
    val amount = 1212
    println("${dollar}${amount}")
}
0 голосов
/ 27 сентября 2018

Вы можете попробовать буквальное представление.

    fun main(args: Array<String>) {
    val amount = "25"
    val escapedString = "~ ${'$'}$amount"
    printString(escapedString)

}

fun printString( str : String) {
    println(str)
}
0 голосов
/ 27 сентября 2018

Попробуйте это

class MainActivity : AppCompatActivity() {
private val trx: Transaction = Transaction(1300.00)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setItem()
}

fun setItem() {
    bind(valueSubtitle = "~ \$${trx.currencyAmount}")
}

fun bind(valueSubtitle: String? = null) {
    val valueSubtitleTextView: TextView = findViewById(R.id.textview)
    valueSubtitleTextView.text = valueSubtitle
}

  class Transaction(var currencyAmount: Double)
}
0 голосов
/ 27 сентября 2018

Шаблоны поддерживаются как внутри необработанных строк , так и внутри экранированных строк .Если вам нужно представить буквенный символ $ в необработанной строке (которая не поддерживает экранирование обратной косой черты) , вы можете использовать следующий синтаксис:

itemAmount.bind(valueSubtitle = "~ \${'$'}${trx.currencyAmount}")

Синтаксис выглядит довольно плохо, но будет работать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...