我是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分割部分。
答案 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();
}