Search code examples
kotlinlocale

Kotlin crashes when locale is not English


First of all I am new in programming, I read other posts but none solved my issue.

I have an app with locals in three languages: Romanian,English, Spanish The app have 2 activities: Main is with data filling the other with result of calculation.
When i test app on other locales than English, crushes.

The problem is that in English app acts very good, in other locales on debugging i get Fatal Exception:

  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;
    }

When i debug on English locale everything works fine no error appear. The Main activity gets translated well, on the Intent for the second activity the app crushes Please help, I cannot find solution on this issue

 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)

as the Exception says i try to check what is the problem with the input specified in exception but all looks fine


Solution

  • By the looks of this

    Invalid double: "1,145"
    

    You defined a double somewhere using a comma instead of a period.

    Check your translations. The Romanian and Spanish variants are using 1,145 instead of 1.145