#android #kotlin #crash #nan #restart
#Android #kotlin #сбой #nan #перезапуск
Вопрос:
Когда я запускаю свое приложение, которое должно получать скорость устройства, я получаю NaN (я думаю, это означает «не число»?) значение для 1-3 секунд в текстовом поле.Числа хранятся в хранилище, но если это Nan, приложение вылетает. Как я могу заменить этот NaN на 0 (ноль) ?… например: If(NaNvalue = true){ (value = 0)} … что-то в этом роде. Я не нашел ничего, написанного на Android или kotlin, только python (с которым я не знаком). Любая помощь была бы отличной!!! Спасибо…
мой код:
fun getSpeed(location: Location): Float{
if (mRunning ) {
// val getkmh = (location.speed * 3.6)
// mSpeedKmH = getkmh.toFloat()
mElapsedSeconds = ((SystemClock.elapsedRealtime()
-mChrono!!.getBase()) / 1000)
mSpeedMeter = mDistanceTotal/mElapsedSeconds.toFloat()
mSpeed = ( mSpeedMeter *3.6).toFloat()// *3.6 > KmH
}
return mSpeedKmH
}
fun updateSpeed() {
val speedMeter = String.format(Locale.getDefault(), "%.1f",mSpeed)
tvSpeed.text = speedMeter
}
Ответ №1:
Вы можете сделать это, как показано в другом ответе, или используя takeIf
оператор и Элвиса:
val speedMeter = String.format(Locale.getDefault(), "%.1f", mSpeed.takeIf { !it.isNaN() } ?: 0.0)
Комментарии:
1. Вместо takeIf вы можете использовать takeUnless и удалить оператор not: mSpeed.takeUnless { it.isNaN() } ?: 0.0
Ответ №2:
val value: Double = yourDoubleValue.let { if (it.isNaN()) 0.0 else it}
То же самое можно применить к значениям с плавающей запятой
Комментарии:
1. Вы должны использовать 0.0, или оно
value
будет иметь типNumber
илиComparable
, а неDouble
.2. Я изменил ответ, чтобы убедиться, что переменная имеет тип double
Ответ №3:
Спасибо Фернандо и Tenfour04!!! Обе версии работают!!
значение скорости в формате = String.format(Locale.getDefault(), «%.1f», mSpeedAverageKmH.takeIf { !it.isNaN() } ?: 0.0)
val speedGesammt = String.format(Locale.getDefault(), «%.1f», mSpeedAverageKmH.let { if (it.isNaN()) 0.0 else it})