0

Here is the error in the last line of the MainActivity.kt file

Format string 'tip_amount' is not a valid format string so it should not be passed to String.format

// I wrote this code while taking a course from android developer.

package com.example.tiptime

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.tiptime.databinding.ActivityMainBinding
import java.text.NumberFormat

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.calculateButton.setOnClickListener { calculateTip() }
    }

    fun calculateTip() {
        val stringInTextFiled = binding.costOfService.text.toString()
        val cost = stringInTextFiled.toDouble()
        val selectedId = binding.tipOptions.checkedRadioButtonId
        val tipPercentage = when (selectedId) {
            R.id.option_twenty_percent -> 0.20
            R.id.option_eighteen_percent -> 0.18
            else -> 0.15
        }
        var tip = tipPercentage * cost
        val roundUp = binding.roundUpSwitch.isChecked
        if (roundUp) {
            tip = kotlin.math.ceil(tip)
        }
//  whether it is possible without these two lines?
        val formattedTip = NumberFormat.getCurrencyInstance().format(tip)
        binding.tipResult.text = getString(R.string.tip_amount, formattedTip)
    }
}

// activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/cost_of_service"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:hint="@string/text_cost_of_service"
        android:inputType="numberDecimal"
        android:minHeight="48dp"
        android:textColorHint="#757575"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/service_question"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/how_was_the_service"
        app:layout_constraintTop_toBottomOf="@+id/cost_of_service"
        app:layout_constraintStart_toStartOf="parent" />

    <RadioGroup
        android:id="@+id/tip_options"
        android:checkedButton="@id/option_twenty_percent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/service_question"
        app:layout_constraintStart_toStartOf="parent"
        android:orientation="vertical">

        <RadioButton
            android:id="@+id/option_twenty_percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/amazing_20" />

        <RadioButton
            android:id="@+id/option_eighteen_percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/good_18" />

        <RadioButton
            android:id="@+id/option_fifteen_percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/ok_15" />
    </RadioGroup>

    <Switch
        android:id="@+id/round_up_switch"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:checked="true"
        android:minHeight="48dp"
        android:text="@string/round_up_tip"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@id/tip_options"
        app:layout_constraintTop_toBottomOf="@id/tip_options"
        tools:ignore="UseSwitchCompatOrMaterialXml" />
    <Button
        android:id="@+id/calculate_button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/calculate"
        app:layout_constraintTop_toBottomOf="@id/round_up_switch"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
    <TextView
        android:id="@+id/tip_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Tip Amount: $10"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/calculate_button" />
</androidx.constraintlayout.widget.ConstraintLayout>

// values\string.xml // same resources for dark theme

<resources>
    <string name="app_name">Tip Time</string>
    <string name="cost_of_service">Cost of Service</string>
    <string name="tip_amount">Tip Amount: %s</string>
    <string name="round_up_tip">Round up tip</string>
    <string name="how_was_the_service">How was the service?</string>
    <string name="amazing_20">Amazing (20%)</string>
    <string name="good_18">Good (18%)</string>
    <string name="ok_15">OK (15%)</string>
    <string name="calculate">Calculate</string>
    <string name="text_cost_of_service">Cost of Service</string>
</resources>

// Unfortunately the site doesn't leak that much code, so I'm writing this text so that the question can pass. I'm sure the question is easy, I'm just new to programming and most often I can not notice the most obvious errors. I hope this time my question will pass.

  • 1
    `getString(R.string.tip_amount, formattedTip.toString())` try by changing like this – Ammar Abdullah Aug 15 '22 at 11:17
  • 1
    %s is used for string type so convert variable before passing it to getString()... – Ammar Abdullah Aug 15 '22 at 11:19
  • Try different way: 1) `Tip Amount:` 2) `binding.tipResult.text = getString(R.string.tip_amount) + formattedTip` – Vadik Sirekanyan Aug 15 '22 at 11:25
  • Does this answer your question? [Format string XXX is not a valid format string so it should not be passed to String.format](https://stackoverflow.com/questions/40765890/format-string-xxx-is-not-a-valid-format-string-so-it-should-not-be-passed-to-str) – Vadik Sirekanyan Aug 15 '22 at 11:26

2 Answers2

0

You need to use dolar sign and number. Could u try this?

 <string name="tip_amount">Tip Amount: %1$s</string>
Enes Zor
  • 973
  • 8
  • 14
0

I just solved this problem in a few seconds... It turned out to be very simple.

It's because of the night\strings.xml file, which also has a tip_amount line, which we also need to change.

A few screenshots to get a better understanding:

night\strings.xml file screenshot

Check this line

Iurii Mg
  • 63
  • 7