对1个多行textView中的数字进行计算并返回结果替换数字

时间:2016-01-12 10:48:20

标签: android sqlite textview

我是Android编程的新手,我正在尝试完成我的第一个应用程序。这是一个食谱转换器。

我已将食谱详细信息存储在SQLite数据库中,而成分文本只是一个由回车符分隔的多行字符串。我已经使用光标将成分数据转换为textview,返回文本(可能是众多变体):

100ml水 500克剁碎 2 x 400g可以压碎西红柿

我最初将每个数量,单位和成分描述分别存储在数据库中,这使得转换时生活变得轻松,但我选择将其存储在多行字符串中,以允许从互联网或其他来源复制和粘贴成分。

我试图提取数字,然后将它们乘以一个百分比,然后返回新转换的数字,以及相应的单位和描述来得到这样的结果:

(乘以200%)

200ml水 1000克剁碎 4 x 400g可以压碎西红柿

我只是不知道怎么做。有人可以帮忙吗?

由于

更新:

我试图做这样的事情以获得数字。

public void Split(){         TextView tvSplit =(TextView)findViewById(R.id.tvSplit);

    final TextView tvTest = (TextView) findViewById(R.id.tvTest);
    String s = tvTest.getText().toString();

    for (int i =0;i <= tvTest.getLineCount();i++){

        tvSplit.setText("");


        String text = s.replaceAll("\\D+", ",");
        tvSplit.append(text);
        tvSplit.append("\n");

    }

它显示了所有数字之间带有“,”但它还包括字符串中的所有数字,如上例中的转换之前,当我只需要100,500,2时它会显示100,500,2,400。从那时起,我不确定如何将它们全部转换。我的“编程思维新手”认为我可以通过INSERT INTO tablename(id,originalvalues)VALUES(我的字符串即100,500,2)将它们存储在临时SQL表中。

然后我可以将它们拉出来,进行计算,更新表格,然后将剩余的字符串添加回我的textview中。我还没有那么远,所以我只是想知道正确的做法是什么。

更新2:

根据我的评论,这是我用来显示一个警告对话框的代码,其中每个项目列在一个单独的行上,然后我使用所选行在任何“”之前查找数字,然后在屏幕上显示文本

public void PopUpSpinnerDialogue(){

    final TextView tvTest = (TextView) findViewById(R.id.tvTest);

    final TextView tv2 = (TextView) findViewById(R.id.tvTest2);

    String s = tvTest.getText().toString();


    final ArrayAdapter myAdapter = new ArrayAdapter<String>(this,
            R.layout.my_dropdown_style, s.split("\n"));



    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
    builder.setTitle("Please choose the key ingredient you need to scale your recipe by.")
            .setCancelable(false)
            .setAdapter(myAdapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    try {
                        String itemName = myAdapter.getItem(which).toString();

                        String[] parts = itemName.split(" ");

                        String itemNumStr = parts[0];

                        TextView tvLineName = (TextView) findViewById(R.id.tvIngredientSelect);
                        EditText et1 = (EditText) findViewById(R.id.etRecipeQtyConvert);
                        EditText et2 = (EditText) findViewById(R.id.etQtyHave);

                        tvLineName.setText(itemName);


                        String b4Space = itemNumStr.replaceAll("\\D+", "");
                        tv2.setText(b4Space);
                        et1.setText(b4Space);
                        et2.setText(b4Space);

                        calculateKeyIngredientPercent();
                    } catch (Exception e) {

                        Toast.makeText(SelectConvertMethod.this, "Your ingredient must have a QTY. eg. 100ml.", Toast.LENGTH_SHORT).show();
                    }

                }

            });
    android.app.AlertDialog alert = builder.create();
    alert.show();

}

我认为我可以使用这个想法,但我不知道如何编码然后显示结果。

更新3:

代码或至少我试图使用的代码的想法就是这个。

TextView tvSplit =(TextView)findViewById(R.id.tvSplit);

    final TextView tvTest = (TextView) findViewById(R.id.tvTest);
    String s = tvTest.getText().toString();


    for (int i =0;i <= tvTest.getLineCount();i++){
    String[] ingreds = s.split("\n");
        tvSplit.setText("");

        String[] parts = ingreds.split(" ");

        String Qty = parts[0];
        String Units = parts[1];
        String Ingredients = parts[2];

        Integer QtyInt = Integer.parseInt(Qty);}

ingreds.split不起作用,而且,我不知道如何指定为每个i分割部分。

1 个答案:

答案 0 :(得分:0)

我最终使用了正则表达式。它允许在有或没有空格的情况下输入数据。因此,我最终使用此代码提取每行的数量,将其乘以百分比,将文本(单位,成分描述)附加到行,然后将其添加到字符串数组,以添加到我的警报对话框。

代码在这里。

public void Split() {

    final TextView tv2 = (TextView) findViewById(R.id.tvTest2);
    TextView tvTest = (TextView) findViewById(R.id.tvTest);
    TextView tvPercent = (TextView) findViewById(R.id.tvPercent);

    String tvP = tvPercent.getText().toString();
    String tvNumOnly = tvP.replaceAll("\\D+", "");
    Integer PercentVal = Integer.parseInt(tvNumOnly);
    String s = tvTest.getText().toString();

    StringBuilder sb = new StringBuilder();

    Pattern p = Pattern.compile("((\\d*) ?(.*)(?:\\n*))");
    Matcher m = p.matcher(s);

    while (m.find()) {

        String Qty = m.group(2) + ".00";
        String Ingred = m.group(3);

        Float QtyFloat = Float.parseFloat(Qty);

        Float newQTY = (QtyFloat * PercentVal) / 100;

        String newQTYstr = newQTY.toString();


        sb.append(newQTYstr + " " + Ingred + "\n");
    }

    String[] lines = sb.toString().split("\n");

    String[] IngredArray = Arrays.copyOfRange(lines, 0, lines.length - 1);

    final ArrayAdapter myAdapter = new ArrayAdapter<String>(this,
            R.layout.my_dropdown_style, IngredArray);


    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
    builder.setTitle("Please choose the key ingredient you need to scale your recipe by.")
            .setCancelable(false)
            .setAdapter(myAdapter, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    try {
                        String itemName = myAdapter.getItem(which).toString();

                        String[] parts = itemName.split(" ");

                        String itemNumStr = parts[0];

                        TextView tvLineName = (TextView) findViewById(R.id.tvIngredientSelect);
                        EditText et1 = (EditText) findViewById(R.id.etRecipeQtyConvert);
                        EditText et2 = (EditText) findViewById(R.id.etQtyHave);

                        tvLineName.setText(itemName);


                        String b4Space = itemNumStr.replaceAll("\\D.\\D+", "");
                        tv2.setText(b4Space);
                        et1.setText(b4Space);
                        et2.setText(b4Space);

                        calculateKeyIngredientPercent();
                    } catch (Exception e) {

                        Toast.makeText(SelectConvertMethod.this, "Your ingredient must have a QTY. eg. 100ml.", Toast.LENGTH_SHORT).show();
                    }

                }

            });
    android.app.AlertDialog alert = builder.create();
    alert.show();

// Toast.makeText(SelectConvertMethod.this,sb,Toast.LENGTH_LONG).show();

}