【问题标题】:Kotlin crashes when locale is not English当语言环境不是英语时,Kotlin 崩溃
【发布时间】:2019-02-12 19:40:24
【问题描述】:

首先我是编程新手,我阅读了其他帖子,但没有解决我的问题。

我有一个与当地人合作的应用程序,支持三种语言:罗马尼亚语、英语、西班牙语 该应用程序有 2 个活动:主要是数据填充另一个计算结果。
当我在英语以外的其他语言环境中测试应用程序时,崩溃了。

问题是在英文应用中表现非常好,在其他语言环境中调试我得到致命异常:

  package com.example.sportbetodds
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.os.Build
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.annotation.RequiresApi
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var ntm = etntm.text
        var gda= etntGDA.text
        var gdd = etntGDD.text
        var ntmM = etntmM.text
        var gdaMG = etMGDA.text
        var gdaMO = edMGDD.text
        var gpaMG = edMGPA.text
        var gpaMO =etMGPD.text
            try {
            btCalT.setOnClickListener {
 /** Statistici din liga **/
 val intent = Intent(this@MainActivity, Rezultate::class.java)
//acasa date
 var ntmA = ntm.toString().toBigDecimal().toDouble()
        var gdaA = gda.toString().toBigDecimal().toDouble()
        var goluriDA = (gdaA/ntmA).toString().toDouble()
 //Debug Exception.kt:45---->       val dgoluriDA:Double = String.format("%.3f", goluriDA).toDouble()
var goluriDAa = dgoluriDA.toString()
                intent.putExtra("tvRgda",goluriDAa)
        //deplasare date
        var gdda = gdd.toString().toBigDecimal().toDouble()
        var goluridd = (gdda/ntmA).toString().toDouble()
        val dgoluridd:Double = String.format("%.3f", goluridd).toDouble()
        var goluridda = dgoluridd.toString()
        intent.putExtra("tvgdd",goluridda)


        /** Calcularea medie goluri selectie **/
        //inscrise acasa gazde
        var ntmMA = ntmM.toString().toBigDecimal().toDouble()
        var gdaMgA = gdaMG.toString().toBigDecimal().toDouble()
        var gdaMgaA: Double =  (gdaMgA/ntmMA).toString().toDouble()
        var goluriMG = gdaMgaA.toString()
        //  inscrise deplasare oaspeti
        var gdMO = gdaMO.toString().toBigDecimal().toDouble()
        var gdMOd = (gdMO/ntmMA).toString().toDouble()
      //  var gdMOda = gdMOd.toString()
        //primite  acasa gazda
        var gpMGa = gpaMG.toString().toBigDecimal().toDouble()
        var gpMGaA = (gpMGa/ntmMA).toString().toDouble()
    //    var gpMGaAa = gpMGaA.toString()
//primite acasa oaspete
        var gpMOa = gpaMO.toString().toBigDecimal().toDouble()
        var gpMOaa = (gpMOa/ntmMA).toString().toDouble()
    //    var gpMOA = gpMOaa.toString()
 /** Calculare forta de atac **/
        //forta atac gazda
 var fortaAG = gdaMgaA/goluriDA
        var fortaAO =  gdMOd/goluridd
        var fortaDG = gpMGaA/goluridd
        var fortaDO = gpMOaa/goluriDA
 /** Calculare numarului de goluri estimat  sa fie inscris **/
        // cate goluri ar trebuii sa inscrie gazda
 var predGazda = fortaAG*fortaDO*goluriDA
        val dpredGazda:Double = String.format("%.3f", predGazda).toDouble()
        var gazdaGol = dpredGazda.toString()
        intent.putExtra("gazdeG", gazdaGol)
var predOaspeti = fortaAO*fortaDG*goluridd
        val dpredOaspeti:Double = String.format("%.3f", predOaspeti).toDouble()
        var oaspetiGol=  dpredOaspeti.toString()
        intent.putExtra("oaspetiG", oaspetiGol)
startActivity(intent)

    }
}catch (ex: Exception){
    println("Exception $ex")
 }

    }

    }
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
fun fixUpLocale(ctx: Context, newLocale: Locale) {
    val res = ctx.resources
    val config = res.configuration
    val curLocale = getLocale(config)
    if (curLocale != newLocale) {
        Locale.setDefault(newLocale)
        val conf = Configuration(config)
        conf.setLocale(newLocale)
        res.updateConfiguration(conf, res.displayMetrics);
    }
}

fun getLocale(config: Configuration): Locale {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return config.locales[0]
    } else {
        //noinspection deprecation
        return config.locale;
    }

当我在英语语言环境下调试时,一切正常,没有出现错误。 主要活动得到了很好的翻译,在应用程序粉碎的第二个活动的意图上 请帮忙,我找不到这个问题的解决方案

 E/AndroidRuntime: [ERB] Update app failure countmain
        [ERB] Update app failure - ActivityThread.currentProcessName : com.example.sportbetodds
        [ERB] Update app failure - Process.myPid : 10552
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.sportbetodds, PID: 10552
        java.lang.NumberFormatException: Invalid double: "1,145"
            at java.lang.StringToReal.invalidReal(StringToReal.java:63)
            at java.lang.StringToReal.initialParse(StringToReal.java:164)
            at java.lang.StringToReal.parseDouble(StringToReal.java:282)
            at java.lang.Double.parseDouble(Double.java:301)
            at com.example.sportbetodds.MainActivity$onCreate$1.onClick(MainActivity.kt:45)
            at android.view.View.performClick(View.java:5205)
            at android.view.View$PerformClick.run(View.java:21164)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

正如异常所说,我尝试检查异常中指定的输入有什么问题,但一切看起来都很好

【问题讨论】:

    标签: kotlin locale


    【解决方案1】:

    看样子

    Invalid double: "1,145"
    

    您在某处使用逗号而不是句点定义了双精度。

    检查您的翻译。罗马尼亚语和西班牙语变体使用1,145 而不是1.145

    【讨论】:

    • 试过没有成功,给出同样的错误 java.lang.NumberFormatException: Invalid double: "1,145"
    • @George 是的,Kars 的意思是尝试1.145
    • 你是 100%,删除了字符串格式 // val dpredGazda:Double = String.format("%.3f", predGazda).toDouble(),但我现在有很多小数,如何以正确的方式添加小数? P.S:抱歉我缺乏知识
    • 感谢您的帮助,通过将 ("%.3f", predGazda).toDouble() 替换为 DecimalFormat("#.##").format(number) 和一切工作正常.
    • @George 为什么不用val dpredGazda:Double = predGazda 替换它,或者继续使用predGazdapredGazda 已经是 Double - 您只是在进行非常昂贵且容易出错的身份转换(从 Double 到 Double)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多