web-dev-qa-db-fra.com

Conversion de chaîne en double sous Android

Essayer d'obtenir deux valeurs d'un EditText et de les manipuler avant de les transmettre à un autre Intent. Ne pas utiliser le type de données primitif afin que je puisse utiliser les méthodes toString.

Le problème est quand j'inclus la protéine = Double.valueOf (p) .doubleValue (); commandes de style, la force du programme se ferme immédiatement sans laisser aucune information dans le logcat.Si je les commente et définit des données factices telles que protein = 1.0; cela fonctionne sans aucun problème ..___ Il en va de même avec les types de données primitifs et l'analyse double. Ce code fonctionne parfaitement avec des données factices en Java normal . Qu'est-ce que je fais de travers?

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);
21
ProfCommie

Je le ferais de cette façon:

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
}

EDIT: "la force du programme se ferme immédiatement sans laisser aucune information dans le logcat"

Je ne sais pas s'il ne faut pas laisser d'informations dans la sortie logcat, mais une fermeture forcée signifie généralement qu'il existe une exception non interceptée, telle qu'une exception NumberFormatException.

67
Izkata

essaye ça: 

double d= Double.parseDouble(yourString);
15
Swapnil Lanjewar

Vous semblez assigner Double object dans le champ de valeur natif double. Est-ce que cela compile vraiment?

Double.valueOf () crée un objet Double afin que .doubleValue () ne soit pas nécessaire.

Si vous voulez un champ double natif, vous devez le définir comme double, puis utiliser.

5
jkj

j'ai un problème similaire . pour la mise en forme correcte du contenu de texte EditText à double valeur, j'utilise ce code:

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;
    }

ceci est indépendant des paramètres régionaux actuels du téléphone et renvoie la double valeur correcte.

j'espère que c'est de l'aide;

2
bershadskiy

Qu'en est-il de l'utilisation du constructeur Double (String)? Alors,

protein = new Double(p);

Je ne sais pas pourquoi ce serait différent, mais pourrait valoir le coup.

2
MikeTheReader

J'ai eu le même problème, mais je viens de comprendre que:

  • l'analyse de la valeur EditText dans la méthode Oncreate a provoqué le blocage de l'application car, au démarrage de l'application, il n'y avait pas de valeur à analyser ou peut-être les espaces réservés qui étaient des lettres.

Mon code: 

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;
    }
}

Je 

2
Hero
  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());
        }
    });
1
Areej Qasrawi
String sc1="0.0";
Double s1=Double.parseDouble(sc1.toString());
0
Neha Trivedi