Преобразование строки в удвоение в Android - PullRequest
21 голосов
/ 29 июля 2011

Попытка получить двойные значения из EditText и манипулировать ими, прежде чем передавать их в другое намерение. Не используется примитивный тип данных, поэтому я могу использовать методы toString.

Проблема в том, когда я включаю белок = Double.valueOf (p) .doubleValue (); При использовании команд стиля программа принудительно закрывается, не оставляя никакой информации в logcat. Если я закомментирую их и установлю некоторые фиктивные данные, например protein = 1.0; это работает без проблем. То же самое происходит с примитивными типами данных и анализом double. Этот код прекрасно работает с фиктивными данными в обычном 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);

Ответы [ 8 ]

70 голосов
/ 29 июля 2011

Я бы сделал это следующим образом:

try {
  txtProt = (EditText) findViewById(R.id.Protein); // Same
  p = txtProt.getText().toString(); // Same
  protein = Double.parseDouble(p); // Make use of autoboxing.  It's also easier to read.
} catch (NumberFormatException e) {
  // p did not contain a valid double
}

РЕДАКТИРОВАТЬ: "принудительное закрытие программы немедленно, не оставляя никакой информации в logcat"

Я не знаю, как не оставить информациюв выводе logcat, но принудительное закрытие обычно означает, что есть необработанное исключение - например, NumberFormatException.

16 голосов
/ 17 декабря 2015

попробуйте это:

double d= Double.parseDouble(yourString);
5 голосов
/ 29 июля 2011

Вы, кажется, присваиваете Двойной объект в собственном двойном поле значения.Это действительно компилируется?

Double.valueOf () создает объект Double , поэтому .doubleValue () не должен быть необходим.

Если вы хотите использовать native double поле, вам нужно определить поле как double и затем использовать .doubleValue ()

2 голосов
/ 08 января 2018

У меня была такая же проблема, но я только что выяснил, что:

  • парсинг значения 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

2 голосов
/ 21 мая 2013

У меня похожая проблема.для правильного форматирования текстового содержимого 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;
    }

это не зависит от текущей локали телефона и возвращает правильное двойное значение.

надеюсь, что это поможет;

2 голосов
/ 29 июля 2011

А как насчет использования конструктора Double (String)?Итак,

protein = new Double(p);

Не знаю, почему все будет иначе, но, возможно, стоит попробовать.

1 голос
/ 16 апреля 2016
  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());
        }
    });
0 голосов
/ 25 ноября 2015
String sc1="0.0";
Double s1=Double.parseDouble(sc1.toString());
...