【问题标题】:Calculating sum of numbers from a file?计算文件中的数字总和?
【发布时间】:2012-10-27 18:08:59
【问题描述】:

我想在 TextView 中显示文件中所有价格的总和(例如 £18.99 £50 等),目前它只是读取/显示文件中的最后价格。

这是我当前写入文件的代码:

total.setText(total.getText());                            
        try {
            FileOutputStream fos = openFileOutput("TotalSavings", Context.MODE_PRIVATE);
            fos.write(total.getText().toString().getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

这是我当前用于读取文件的代码(burmat 成员建议进行一些更改):

public void savingstotalbutton(View view) {

        double total = 0;

        try {
            BufferedReader inputReader = new BufferedReader(new InputStreamReader(
                    openFileInput("TotalSavings")));
            String inputString;
            @SuppressWarnings("unused")
            StringBuffer stringBuffer = new StringBuffer();                
            while ((inputString = inputReader.readLine()) != null) {

                if (inputString.length() > 0) {
                String line = inputString.replaceAll("[^0-9.]", "");
                total = total + Double.parseDouble(line);
                }
            }
            savingstotaltext.setText(String.valueOf(total));
        } catch (IOException e) {
            e.printStackTrace();
        }               
    }

感谢任何帮助。

编辑: 我手动修改了 TotalSavings.txt 的内容并添加了不同的价格并将其复制到应用程序的 /files 文件夹中。它读取所有价格并给出有效的总和,但问题是写入函数覆盖了第一行,它永远不会进入下一行。

编辑2:使用calc按钮显示计算并将结果写入文件TotalSavings.txt的整个代码

public void calc(View view) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        if (price.getText().toString().equals(""))
            return;
        if (disc.getText().toString().equals(""))
            return;
        double priceVal = Double.parseDouble(price.getText().toString());
        double discVal = Double.parseDouble(disc.getText().toString());
        double discount = priceVal / 100.0 * discVal;
        int di = (int) (discount * 100);
        double totalVal = priceVal - (di / 100.0);
        NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.getDefault());
        savings.setText(nf.format(discount));
        total.setText(nf.format(totalVal));

        savings.setText(savings.getText());                            
        try {
            FileOutputStream fos = openFileOutput("TotalSavings", Context.MODE_PRIVATE);
            fos.write(savings.getText().toString().getBytes());         
        fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

【问题讨论】:

  • 你能告诉我你正在阅读的文件吗?
  • @Paul Harris 文件名是 TotalSavings.txt 并且它包含一行: $455.88 基本上写入函数不会转到下一行它一直重写第一行。

标签: java android io


【解决方案1】:

我认为你不需要这条线

String line = inputString.replaceAll("[^0-9.]", "");

你必须说

String line = inputString;

它必须适合你。

【讨论】:

  • 我使用 String line = inputString.replaceAll("[^0-9.]", "");因为该文件包含货币符号。
  • 在这种情况下,您的表达不正确。你能再检查一下你的表情吗?你的正则表达式有问题。
  • 此链接可能对您有所帮助。stackoverflow.com/questions/252626/…
  • 谢谢你的链接,我检查了,表达很好。我认为问题可能出在文件中。
  • @jlordo 是的,你是对的,我设法通过 adb 命令从 \data\data 路径获取文本文件,它只有一行,所以该函数会覆盖当前行并且不会执行到下一行。
【解决方案2】:

写入文件的问题的答案是,每次写入文件时,你都在写之前的内容,你需要做的就是改变

FileOutputStream fos = openFileOutput("TotalSavings", Context.MODE_PRIVATE)

到:

FileOutputStream fos = openFileOutput("TotalSavings", Context.MODE_PRIVATE | Context.MODE_APPEND)

这告诉 android 你想要附加到文件并保持它的私密性。

编辑 您的新问题是因为您将文本直接放在其他文本之后,您想在文件中强制换行。最简单的方法是:

String totalFromField = total.getText().toString() + "\n";
fos.write(totalFromField.getBytes());

【讨论】:

  • 感谢您的回复,我刚刚进行了更改。当我运行应用程序并保存价格时,它会显示价格,但是当我保存另一个价格(第二次)并按下 savetotal 按钮时,应用程序崩溃并且不显示总金额。 Eclipse Log Cat 显示以下错误:FATAL EXCEPTION: main , Caused by: java.lang.NumberFormatException: Invalid double: "84.48845.46" , at java.lang.StringToReal.invalidReal(StringToReal.java:63)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多