2011-12-15 28 views
28

jeśli mam ustawić tekst w TextView w taki sposób, który nie jest problemem:jak uzyskać tekst z TextView

tv.setText("" + ANS[i]); 

to po prostu się z tego sposobu.

 String a = tv.getText().toString(); 
    int A = Integer.parseInt(a); 

Ale w przypadku ustawienia wartości w textView.

tv1.setText(" " + X[i] + "\n" + "+" + " " + Y[i]); 

który jest podobny do tego

   5 
      +9 

Mam problem, tej wartości, jak się dostać.

+0

Chcesz pokazać wynik dodawania tych numerów ..? – Mudassir

+1

jaki jest problem? – freshDroid

+0

moje pytanie brzmi, mam wartość 5 + 9 w jednym widoku tekstowym, jak już wspomniałem., Więc jak uzyskać tę wartość, jak tv.getText(). ToString(); –

Odpowiedz

34

I haven” t przetestował to - ale powinien dać ci ogólny pogląd kierunek, który musisz wziąć.

Aby to działało, mam zamiar założyć kilka rzeczy o tekście TextView:

  1. TextView składa się z linii rozdzielone "\n".
  2. Pierwsza linia nie będzie zawierała operatora (+, -, * lub /).
  3. Po pierwszym wierszu może być zmienna liczba linii w TextView, które wszystkie zawierają jedenoperatora i jeden numer.
  4. Operator zawsze będzie pierwszym Char linii.

Najpierw musimy uzyskać tekst:

String input = tv1.getText().toString(); 

Następnie podzieliliśmy go na każdej linii:

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

Teraz musimy obliczyć wartość:

int total = Integer.parseInt(lines[0].trim()); //We know this is a number. 

for(int i = 1; i < lines.length(); i++) { 
    total = calculate(lines[i].trim(), total); 
} 

Obliczona metoda powinna wyglądać tak, zakładając, że znamy pierwszą Char linii jest operatorem:

private int calculate(String input, int total) { 
    switch(input.charAt(0)) 
     case '+': 
     return total + Integer.parseInt(input.substring(1, input.length()); 
     case '-': 
     return total - Integer.parseInt(input.substring(1, input.length());    
     case '*': 
     return total * Integer.parseInt(input.substring(1, input.length());    
     case '/': 
     return total/Integer.parseInt(input.substring(1, input.length()); 
} 

EDIT

Więc powyżej podano w komentarzu poniżej robi „od lewej do prawej” kalkulacja, ignorując normalnej kolejności (+ i/before + i -).

Poniższa robi obliczania właściwą drogę:

String input = tv1.getText().toString(); 
input = input.replace("\n", ""); 
input = input.replace(" ", ""); 
int total = getValue(input); 

Sposób getValue jest metoda rekurencyjna i powinno to wyglądać tak:

private int getValue(String line) { 
    int value = 0; 

    if(line.contains("+")) { 
    String[] lines = line.split("\\+"); 
    value += getValue(lines[0]); 

    for(int i = 1; i < lines.length; i++) 
     value += getValue(lines[i]); 

    return value; 
    } 

    if(line.contains("-")) { 
    String[] lines = line.split("\\-"); 
    value += getValue(lines[0]); 

    for(int i = 1; i < lines.length; i++) 
     value -= getValue(lines[i]); 

    return value; 
    } 

    if(line.contains("*")) { 
    String[] lines = line.split("\\*"); 
    value += getValue(lines[0]); 

    for(int i = 1; i < lines.length; i++) 
     value *= getValue(lines[i]); 

    return value; 
    } 

    if(line.contains("/")) { 
    String[] lines = line.split("\\/"); 
    value += getValue(lines[0]); 

    for(int i = 1; i < lines.length; i++) 
     value /= getValue(lines[i]); 

    return value; 
    } 

    return Integer.parseInt(line); 
} 

Szczególne przypadki, że metoda rekurencyjna nie obsługuje :

  • Jeśli pierwsza liczba jest ujemna, np. -3 + 5 * 8.
  • Podwójne operatory, np. 3 * -6 lub 5/-4.

Również rzeczywistości używamy Integers może dać jakieś „dziwne” wyniki w niektórych przypadkach, jak na przykład 5/3 = 1.

+0

To nie zadziała zbyt dobrze. Rozważmy następujący scenariusz: 5 + 5 * 3 Rzeczywisty wynik to 20 (5 + 5 * 3 = 5 + 15 = 20), ale twój kod ściśle działa od lewej do prawej ignorując fakt, że mnożenie/dzielenie powinno być traktowane jako pierwsze i daje 30 (5 + 5 * 3 = 10 * 3 = 30). – Jave

+0

Dlatego właśnie oświadczyłem: "ale powinno dać ci ogólne pojęcie o kierunku, który musisz wziąć.". – kaspermoerch

+0

Tak, po prostu pokazuję to, żeby ktoś nie pomylił się, gdy nie działał zgodnie z oczekiwaniami (jak twierdzisz, nie testowałeś go). – Jave

0

Spróbuj Tak.

tv1.setText(" " + Integer.toString(X[i]) + "\n" + "+" + " " + Integer.toString(Y[i])); 
+0

chce, aby wartość z widoku tekstowego nie była ustawiona w widoku tekstowym, który już ustawił wartość w podglądzie tekstowym. – Pratik

0

split z znak + jak ten sposób

String a = tv.getText().toString(); 
String aa[]; 
if(a.contains("+")) 
    aa = a.split("+"); 

teraz przekształcić tablicę

Integer.parseInt(aa[0]); // and so on 
+0

String a tv.getText(). ToString(); , to nie rozumiem. –

+0

Przepraszam, że błąd drukowania – Pratik

+0

musisz zamienić "\ n" na "", a następnie przyciąć ciąg po tym, jak rozdzielisz ciąg znaków. – Pratik

0

Musisz wykonać następujące czynności:

a=a.replace("\n"," "); 
a=a.trim(); 
String b[]=a.split("+"); 
int k=Integer.ValueOf(b[0]); 
int l=Integer.ValueOf(b[1]); 
int sum=k+l; 
0

Jeśli jest to suma wszystkich liczb, zrobiłem mały fragment dla ciebie, który może obsłużyć zarówno +, jak i - używając wyrażeń regularnych (zostawiłem tam kilka wywołań do wydrukowania, aby pomóc wyobrazić co się dzieje):

final String string = " " + 5 + "\n" + "-" + " " + 9+"\n"+"+"+" "+5; //Or get the value from a TextView 
    final Pattern pattern = Pattern.compile("(-?).?(\\d+)"); 
    Matcher matcher = pattern.matcher(string); 

    System.out.print(string); 
    System.out.print('\n'); 
    int sum = 0; 

    while(matcher.find()){ 
     System.out.print(matcher.group(1)); 
     System.out.print(matcher.group(2)); 
     System.out.print('\n'); 
     sum += Integer.parseInt(matcher.group(1)+matcher.group(2)); 
    } 
    System.out.print("\nSum: "+sum); 

Ten kod drukuje następujące:

5 
- 9 
+ 5 
5 
-9 
5 

Sum: 1 

Edit: przepraszam jeśli źle zrozumiałem pytanie, to było trochę niejasne, co chcesz zrobić. Zakładałem, że chcesz uzyskać sumę liczb jako liczbę całkowitą, a nie jako łańcuch.

Edit2: aby uzyskać numery oddzielone od siebie, coś jak to zrobić w zamian:

final String string = " " + 5 + "\n" + "-" + " " + 9+"\n"+"+"+" "+5; //Or get the value from a TextView 
    final Pattern pattern = Pattern.compile("(-?).?(\\d+)"); 
    Matcher matcher = pattern.matcher(string); 
    ArrayList<Integer> numbers = new ArrayList<Integer>(); 

    while(matcher.find()){ 
     numbers.add(Integer.parseInt(matcher.group(1)+matcher.group(2))); 
    } 
Powiązane problemy