0

EditText フィールドに入力された数値を取得し、それを Double に解析し、別の Double 値 (合計) に追加または削除するコードがあります。これは、入力された値 (または追加された値) がそれぞれ 1000 または -1000 よりも高いまたは低い場合を除いて、ほとんどの場合うまく機能します。

ここにはいくつかの注意点があります。ユーザーが値を追加するために押すボタンには、ボタンが押されたときに EditText フィールドが空白かどうかを確認するためのチェックがあります。Toastその場合、何もせず、空白以外の値を入力する必要があることをユーザーに通知します。一方、ユーザーが値 (たとえば 999.99 以下) を入力すると、EditText フィールドがクリアされ、前述の合計に値が追加され、入力された値が ListView アダプターに配置されます。

ここで、奇妙な動作について説明します。ユーザーが 1000 以上の値を入力すると、合計が何であっても (たとえば、500 から 1000 を引いた合計でもこの問題が再現されます)、金額が ListView に追加されますが、 sum は変更されず、EditText は入力された値を保持し (値が合計から減算された場合は先頭にマイナス記号を追加します)、ユーザーには空白以外の値を入力する必要があることが通知されます。

通常、ListView 内のアイテムをクリックすると、リストからアイテムが削除され、その金額が合計に追加または合計から削除されます。これを 1000 以上の値で試行するとNumberFormatException、「無効な Double」を引用してアプリがクラッシュします。

上記のアクションを処理するコードと LogCat を以下に掲載します。誰かがこの問題に取り組むのを手伝ってくれるなら、私は大いに感謝します.

/**
     * Method to handle ListView clicks. It should ask the user if they want to
     * remove the clicked item, and on confirmation, should do so.
     */
    @Override
    protected void onListItemClick(ListView l, View v, final int position, long id){
        final String item = (String) getListAdapter().getItem(position).toString();
        final TextView allowance = (TextView) findViewById(R.id.main_textview_allowance);

        // Offer up a dialog window to ask if the user really wants to delete
        // the clicked item.
        AlertDialog.Builder deleteDialog = new AlertDialog.Builder(this);
        deleteDialog.setTitle("Confirmation");
        deleteDialog.setMessage("Are you sure you want to delete " + item + "?");
        deleteDialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface arg0, int arg1){
                // Delete the item
                adapter.remove(item);
                adapter.notifyDataSetChanged();

                // We need to remove the deleted value from our allowance
                double subtraction = Double.parseDouble(item.toString());
                double newValue = Double.parseDouble(allowance.getText().toString()) - subtraction;
                allowance.setText(moneyFormat.format(newValue));

                Toast.makeText(MainActivity.this, item + " transaction deleted.", Toast.LENGTH_LONG).show();
            }
        });
        deleteDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface arg0, int arg1){
                // Do nothing
            }
        });
        deleteDialog.show();
    }// onListItemClick

...

/**
     * Add an expense to the ListView
     * @param view The calling View object.
     */
    public void addExpense(View view){
        EditText expense = (EditText)findViewById(R.id.main_edittext_expenseentry);
        TextView allowance  = (TextView) findViewById(R.id.main_textview_allowance);

        // Invert the value given such that it subtracts the expense from the allowance,
        // not add to it. But first, if the field is blank, don't do anything and let
        // the user know they need to input a value first.
        try{
            double expenseValue = Double.parseDouble(expense.getText().toString()) * -1;

            expense.setText(moneyFormat.format(expenseValue));
            adapter.add(expense.getText().toString());
            adapter.notifyDataSetChanged();

            // We need to subtract the new value from our daily allowance
            double subtraction = Double.parseDouble(expense.getText().toString());
            double newValue = (Double.parseDouble(allowance.getText().toString())) + subtraction;
            allowance.setText(moneyFormat.format(newValue));
            expense.setText("");
        }catch(NumberFormatException e){
            Toast.makeText(this, "You need to enter a non-blank amount!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * Add a credit to the ListView
     * @param view The calling View object.
     */
    public void addCredit(View view){
        EditText expense = (EditText)findViewById(R.id.main_edittext_expenseentry);
        TextView allowance  = (TextView) findViewById(R.id.main_textview_allowance);

        // Invert the value given such that it subtracts the expense from the allowance,
        // not add to it. But first, if the field is blank, don't do anything and let
        // the user know they need to input a value first.
        try{
            double expenseValue = Double.parseDouble(expense.getText().toString());

            expense.setText(moneyFormat.format(expenseValue));
            adapter.add(expense.getText().toString());
            adapter.notifyDataSetChanged();

            // We need to add the new value to our daily allowance
            double addition = Double.parseDouble(expense.getText().toString());
            double newValue = (Double.parseDouble(allowance.getText().toString())) + addition;
            allowance.setText(moneyFormat.format(newValue));
            expense.setText("");
        }catch(NumberFormatException e){
            Toast.makeText(this, "You need to enter a non-blank amount!", Toast.LENGTH_SHORT).show();
        }

        /** OLD CODE

        EditText expense = (EditText)findViewById(R.id.main_edittext_expenseentry);
        TextView allowance  = (TextView) findViewById(R.id.main_textview_allowance);

        expense.setText(moneyFormat.format(Double.parseDouble(expense.getText().toString())));
        expense.setTextColor(Color.GREEN);

        adapter.add(expense.getText().toString());
        adapter.notifyDataSetChanged();
        expense.setTextColor(Color.BLACK);

        // We need to add the new value from our daily allowance
        double addition = Double.parseDouble(expense.getText().toString());
        double newValue = (Double.parseDouble(allowance.getText().toString())) + addition;
        allowance.setText(moneyFormat.format(newValue));
        if(newValue < 0)
            allowance.setTextColor(Color.RED);
        else
            allowance.setTextColor(Color.BLACK);
        expense.setText("");
        */
    }

LogCat:

03-30 15:51:36.831: E/AndroidRuntime(15713): FATAL EXCEPTION: main
03-30 15:51:36.831: E/AndroidRuntime(15713): java.lang.NumberFormatException: Invalid double: "1,000.00"
03-30 15:51:36.831: E/AndroidRuntime(15713):    at java.lang.StringToReal.invalidReal(StringToReal.java:63)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at java.lang.StringToReal.parseDouble(StringToReal.java:269)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at java.lang.Double.parseDouble(Double.java:295)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at com.argusrho.budgeteer.MainActivity$1.onClick(MainActivity.java:249)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at android.os.Looper.loop(Looper.java:137)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at android.app.ActivityThread.main(ActivityThread.java:5041)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at java.lang.reflect.Method.invokeNative(Native Method)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at java.lang.reflect.Method.invoke(Method.java:511)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-30 15:51:36.831: E/AndroidRuntime(15713):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

このエラーは、ParseDouble がコンマ (,) の処理方法を認識していないために発生します。この問題を解決する最も簡単な方法は、事前に解析する String で ReplaceAll(",", "") を使用することです。

于 2013-03-31T21:57:15.247 に答える