Преобразование String в Double в Android
Попытка получить двойные значения из EditText и манипулировать ими, прежде чем передавать их другому намерению. Не используйте примитивный тип данных, поэтому я могу использовать методы toString.
Проблема заключается в том, что я включаю в себя белок = Double.valueOf(p).doubleValue(); команды программы, программная сила немедленно закрывается, не оставляя никакой информации в logcat. Если я прокомментирую их и задаю некоторые фиктивные данные, такие как protein = 1.0; он работает без проблем.
То же самое происходит с примитивными типами данных и синтаксическим разбором. Этот код отлично работает с фиктивными данными в обычной Java.
Что я делаю неправильно?
EditText txtProt, txtCarb, txtFat, txtFiber, txtPoints;
String p, c, f, fi;
Double protein, carbs, fat, fiber;
double temp;
Integer points;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("Create Prompt", "ready for layout");
setContentView(R.layout.main);
Log.v("Layout Created", "ready for variable assignment");
txtProt = (EditText) findViewById(R.id.Protein);
txtCarb = (EditText) findViewById(R.id.Carbs);
txtFat = (EditText) findViewById(R.id.Fat);
txtFiber = (EditText) findViewById(R.id.Fiber);
txtPoints = (EditText) findViewById(R.id.Points);
btnCalc = (Button) findViewById(R.id.Calc);
Log.v("Variables Assigned", "ready for double assignment");
p = txtProt.getText().toString();
c = txtCarb.getText().toString();
f = txtFat.getText().toString();
fi = txtFiber.getText().toString();
protein=Double.valueOf(p).doubleValue();
carbs=Double.valueOf(c).doubleValue();
fat=Double.valueOf(f).doubleValue();
fiber=Double.valueOf(fi).doubleValue();
Log.v("Doubles parsed", "ready for calculations");
//these are the problem statements
protein = 1.0;
carbs = 1.0;
fat = 1.0;
fiber = 1.0;
protein *= 16;
carbs *= 19;
fat *= 45;
fiber *= 14;
temp = protein + carbs + fat - fiber;
temp = temp/175;
points = new Integer((int) temp);
Ответы
Ответ 1
Я бы сделал это следующим образом:
try {
txtProt = (EditText) findViewById(R.id.Protein); // Same
p = txtProt.getText().toString(); // Same
protein = Double.parseDouble(p); // Make use of autoboxing. It also easier to read.
} catch (NumberFormatException e) {
// p did not contain a valid double
}
EDIT: "программная сила немедленно закрывается, не оставляя никакой информации в логарифме"
Я не знаю, что вы не оставляете информацию в выводе logcat, но принудительное закрытие обычно означает, что это неперехваченное исключение - например, исключение NumberFormatException.
Ответ 2
попробуйте следующее:
double d= Double.parseDouble(yourString);
Ответ 3
Кажется, вы назначили Double объект в поле с двойным значением. Это действительно компилируется?
Double.valueOf() создает объект Double, поэтому .doubleValue() не требуется.
Если вы хотите собственное двойное поле, вам нужно определить поле как двойное, а затем использовать .doubleValue()
Ответ 4
Как использовать конструктор Double (String)? Таким образом,
protein = new Double(p);
Не знаю, почему это было бы иначе, но может стоить того.
Ответ 5
У меня аналогичная проблема.
для правильного форматирования текстового содержимого EditText для двойного значения я использую этот код:
try {
String eAm = etAmount.getText().toString();
DecimalFormat dF = new DecimalFormat("0.00");
Number num = dF.parse(eAm);
mPayContext.amount = num.doubleValue();
} catch (Exception e) {
mPayContext.amount = 0.0d;
}
это не зависит от текущей локали телефона и возвращает правильное двойное значение.
надеюсь, что это поможет;
Ответ 6
kw=(EditText)findViewById(R.id.kw);
btn=(Button)findViewById(R.id.btn);
cost=(TextView )findViewById(R.id.cost);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { cst = Double.valueOf(kw.getText().toString());
cst = cst*0.551;
cost.setText(cst.toString());
}
});
Ответ 7
У меня была такая же проблема, но я только что понял, что:
- Разбор значения EditText в методе Oncreate вызвал сбой приложения, поскольку при запуске приложения нет значений для разбора или, возможно, заполнителей, которые являются буквами.
Мой код:
package com.example.herodav.volumeapp;
import android.renderscript.Double2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
EditText height, length, depth;
TextView volume;
double h,l,d,vol;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
height = (EditText)findViewById(R.id.h);
length = (EditText)findViewById(R.id.l);
depth = (EditText)findViewById(R.id.d);
volume = (TextView)findViewById(R.id.v);
Button btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calculateVolume();
volume.setText("Volume = " + String.valueOf(vol));
}
});
}
public void calculateVolume(){
h = Double.parseDouble(height.getText().toString());
l = Double.parseDouble(length.getText().toString());
d = Double.parseDouble(depth.getText().toString());
vol = h*l*d;
}
}
I
Ответ 8
String sc1="0.0";
Double s1=Double.parseDouble(sc1.toString());