java.lang.RuntimeException: невозможно запустить действие. ComponentInfo: java.lang.NumberFormatException: для входной строки: "4.90" - PullRequest
0 голосов
/ 10 января 2019

Я следую учебному пособию для приложения заказа еды, и я добавляю интегрированный PayPal Payment. Поэтому, если я нажму на кнопку FButton:

alertDialog.setPositiveButton("Abschicken", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //get comment adress from alert Dialog
            adress = edtAddress.getText().toString();
            comment = edtComment.getText().toString();

            String formatAmount = txtTotalPrice.getText().toString()
                                    .replace("€","")
                                    .replace(",","")
                                    .replaceAll("\\s+","");

            PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(formatAmount),"EUR","Pizza App Order", PayPalPayment.PAYMENT_INTENT_SALE);
            Intent intent = new Intent (getApplicationContext(), PaymentActivity.class);
            intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION,config);
            intent.putExtra(PaymentActivity.EXTRA_PAYMENT,payPalPayment);
            startActivityForResult(intent,PAYPAL_REQUEST_CODE);

            }


        });


    alertDialog.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int i) {
            dialog.dismiss();
        }
    });

    alertDialog.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if(requestCode == PAYPAL_REQUEST_CODE)
    {
        if (resultCode == RESULT_OK)
        {
            PaymentConfirmation confirmation = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
            if(confirmation != null)
            {
                try
                {
                    String paymentDetail = confirmation.toJSONObject().toString(4);
                    JSONObject jsonObject = new JSONObject(paymentDetail);


                    //CREATE NEW REQUEST
                    Request request = new Request(
                            Common.currentUser.getPhone(),
                            Common.currentUser.getName(),
                            adress,
                            txtTotalPrice.getText().toString(),
                            "0",
                            comment,
                            jsonObject.getJSONObject("response").getString("state"),
                            cart
                    );

                    //Submit to Firebase
                    requests.child(String.valueOf(System.currentTimeMillis()))
                            .setValue(request);
                    //DeleteCart
                    new Database(getBaseContext()).cleanCart();
                    Toast.makeText(Cart.this, "Vielen Dank! Ihre Bestellung wurde soeben abgeschickt!", Toast.LENGTH_SHORT).show();
                    finish();


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Toast.makeText(this, "Zahlung abgebrochen!", Toast.LENGTH_SHORT).show();
        else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID)
            Toast.makeText(this, "Fehler!", Toast.LENGTH_SHORT).show();
    }
}

private void loadListFood() {
    cart = new Database(this).getCarts();
    adapter = new CartAdapter(cart, this);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);

    //Calculate total
    int total = 0;
    for (Order order:cart)
        total+=(Integer.parseInt(order.getPrice()))*(Integer.parseInt(order.getQuantity()));
    Locale locale = new Locale("de", "DE");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

    txtTotalPrice.setText(fmt.format(total));

}

Я получил эту ошибку:

E / AndroidRuntime: FATAL EXCEPTION: main Процесс: de.pizza, PID: 29841 java.lang.RuntimeException: невозможно запустить действие ComponentInfo {de.pizza/de.pizza.Cart}: java.lang.NumberFormatException: для входной строки: "4.90" на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2957) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3032) atroid.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1696) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6944) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374) Вызывается: java.lang.NumberFormatException: для входной строки: "4.90" на java.lang.Integer.parseInt (Integer.java:608) на java.lang.Integer.parseInt (Integer.java:643) в de.pizza.Cart.loadListFood (Cart.java:212) в de.pizza.Cart.onCreate (Cart.java:102) на android.app.Activity.performCreate (Activity.java:7174) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1220) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2910) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3032) atroid.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1696) на android.os.Handler.dispatchMessage (Handler.java:105) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main (ActivityThread.java:6944) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

Сначала я попытался использовать "," в своих ценах, но тот же результат, но с кодом ошибки

Для входной строки: "4,90"

Если я уберу все "." или ",", и у меня будет в общей сложности 8 €, я получу в песочнице PayPal общую стоимость 800 €.

Если это поможет мне решить мою проблему:

CartAdapter.java

 @Override
public void onBindViewHolder(@NonNull CartViewHolder holder, int position) {
    TextDrawable drawable = TextDrawable.builder()
            .buildRound(""+listData.get(position).getQuantity(), Color.RED);
    holder.img_cart_count.setImageDrawable(drawable);

    Locale locale = new Locale("de", "DE");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
    int price = (Integer.parseInt(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));
    holder.txt_price.setText(fmt.format(price));
    holder.txt_cart_name.setText(listData.get(position).getProductName());
}

UPDATE

Изменено Integer.parseInt на Double.parseDouble

Результат: Если я использую десятичные цены, общая цена будет целочисленной.

Как: 4,10 € + 4,00 = 8,00 € или 8,90 € + 4,50 = 12,00 € следует 4,10 € + 4,00 = 8,10 € или 8,90 € + 4,50 = 13,40 €

Фактический код:

Cart.java

alertDialog.setPositiveButton("Abschicken", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //get comment adress from alert Dialog
            adress = edtAddress.getText().toString();
            comment = edtComment.getText().toString();

            String formatAmount = txtTotalPrice.getText().toString()
                                    .replace("€","")
                                    .replace(",",".")
                                    .replaceAll("\\s+","");

            PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(formatAmount),"EUR","Pizzeria Bacco Usingen App Order", PayPalPayment.PAYMENT_INTENT_SALE);
            Intent intent = new Intent (getApplicationContext(), PaymentActivity.class);
            intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION,config);
            intent.putExtra(PaymentActivity.EXTRA_PAYMENT,payPalPayment);
            startActivityForResult(intent,PAYPAL_REQUEST_CODE);

            }


        });


    alertDialog.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int i) {
            dialog.dismiss();
        }
    });

    alertDialog.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if(requestCode == PAYPAL_REQUEST_CODE)
    {
        if (resultCode == RESULT_OK)
        {
            PaymentConfirmation confirmation = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
            if(confirmation != null)
            {
                try
                {
                    String paymentDetail = confirmation.toJSONObject().toString(4);
                    JSONObject jsonObject = new JSONObject(paymentDetail);


                    //CREATE NEW REQUEST
                    Request request = new Request(
                            Common.currentUser.getPhone(),
                            Common.currentUser.getName(),
                            adress,
                            txtTotalPrice.getText().toString(),
                            "0",
                            comment,
                            jsonObject.getJSONObject("response").getString("state"),
                            cart
                    );

                    //Submit to Firebase
                    requests.child(String.valueOf(System.currentTimeMillis()))
                            .setValue(request);
                    //DeleteCart
                    new Database(getBaseContext()).cleanCart();
                    Toast.makeText(Cart.this, "Vielen Dank! Ihre Bestellung wurde soeben abgeschickt!", Toast.LENGTH_SHORT).show();
                    finish();


                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Toast.makeText(this, "Zahlung abgebrochen!", Toast.LENGTH_SHORT).show();
        else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID)
            Toast.makeText(this, "Fehler!", Toast.LENGTH_SHORT).show();
    }
}

private void loadListFood() {
    cart = new Database(this).getCarts();
    adapter = new CartAdapter(cart, this);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);

    //Calculate total
    int total = 0;
    for (Order order:cart)
        total+=(Double.parseDouble(order.getPrice()))*(Integer.parseInt(order.getQuantity()));
    Locale locale = new Locale("de", "DE");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);

    txtTotalPrice.setText(fmt.format(total));

}

CartAdapter.java

@Override
public void onBindViewHolder(@NonNull CartViewHolder holder, int position) {
    TextDrawable drawable = TextDrawable.builder()
            .buildRound(""+listData.get(position).getQuantity(), Color.RED);
    holder.img_cart_count.setImageDrawable(drawable);

    Locale locale = new Locale("de", "DE");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
    double price = (Double.parseDouble(listData.get(position).getPrice()))*(Double.parseDouble(listData.get(position).getQuantity()));
    //int price = (Integer.parseInt(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));
    holder.txt_price.setText(fmt.format(price));
    holder.txt_cart_name.setText(listData.get(position).getProductName());
}

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Integer.parseInt не ожидает ","

От: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt%28java.lang.String%29

Разбирает строковый аргумент как десятичное целое число со знаком. Все символы в строке должны быть десятичными цифрами, за исключением того, что первый символ может быть знаком минус ASCII '-' ('\ u002D') для обозначения отрицательного значения или знаком плюс ASCII '+' ('\ u002B') указать положительное значение. Полученное целочисленное значение возвращается точно так же, как если бы аргумент и основание 10 были заданы в качестве аргументов метода parseInt (java.lang.String, int).

0 голосов
/ 10 января 2019

Изменить эту строку:

int price = (Integer.parseInt(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));

К этому:

double price = (Double.parseDouble(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));
0 голосов
/ 10 января 2019

Вы анализируете 4.90, который не является целым числом, поэтому вы, конечно, не можете проанализировать его как целое число.

Либо используйте Double.parseDouble или Float.parseFloat.

...