java.lang.RuntimeException:无法启动 activity ComponentInfo:java.lang.NumberFormatException:对于输入字符串:“4.90”
java.lang.RuntimeException: Unable to start activity ComponentInfo: java.lang.NumberFormatException: For input string: "4.90"
我正在学习食品订购应用程序的教程,并且我添加了集成的 PayPal 支付。所以如果我点击我的 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
Process: de.pizza, PID: 29841
java.lang.RuntimeException: Unable to start activity ComponentInfo{de.pizza/de.pizza.Cart}: java.lang.NumberFormatException: For input string: "4.90"
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NumberFormatException: For input string: "4.90"
at java.lang.Integer.parseInt(Integer.java:608)
at java.lang.Integer.parseInt(Integer.java:643)
at de.pizza.Cart.loadListFood(Cart.java:212)
at de.pizza.Cart.onCreate(Cart.java:102)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
我首先尝试在我的价格中使用“,”,但结果相同,但错误代码为
For input string: "4,90"
如果我删除所有“.”或“,”,我将总共获得 8€,我将在 PayPal Sandbox 中获得总价 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());
}
更新
Changed Integer.parseInt
to 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());
}
你解析的4.90不是整数,当然不能解析为整数。
请改用 Double.parseDouble
或 Float.parseFloat
。
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) 方法一样。
更改此行:
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()));
我正在学习食品订购应用程序的教程,并且我添加了集成的 PayPal 支付。所以如果我点击我的 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 Process: de.pizza, PID: 29841 java.lang.RuntimeException: Unable to start activity ComponentInfo{de.pizza/de.pizza.Cart}: java.lang.NumberFormatException: For input string: "4.90" at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) Caused by: java.lang.NumberFormatException: For input string: "4.90" at java.lang.Integer.parseInt(Integer.java:608) at java.lang.Integer.parseInt(Integer.java:643) at de.pizza.Cart.loadListFood(Cart.java:212) at de.pizza.Cart.onCreate(Cart.java:102) at android.app.Activity.performCreate(Activity.java:7174) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
我首先尝试在我的价格中使用“,”,但结果相同,但错误代码为
For input string: "4,90"
如果我删除所有“.”或“,”,我将总共获得 8€,我将在 PayPal Sandbox 中获得总价 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());
}
更新
Changed
Integer.parseInt
toDouble.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());
}
你解析的4.90不是整数,当然不能解析为整数。
请改用 Double.parseDouble
或 Float.parseFloat
。
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) 方法一样。
更改此行:
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()));