2010-08-24 8 views
9

Mam ciąg, powiedz "600sp", z którego chcę uzyskać część całkowitą (600).Najlepszy sposób, aby uzyskać całkowitą część ciągu "600sp"?

Jeśli wykonam Integer.valueOf("600sp"), otrzymam wyjątek ze względu na nie numeryczną wartość "s" napotkaną w ciągu znaków.

Jaki jest najszybszy sposób, aby pobrać część całkowitą?

Dzięki!

+2

Czy część numeryczna jest widoczna jako pierwsza? czy to zawsze jest trzycyfrowa liczba? –

+0

Tak, zawsze jest to liczba o zmiennej długości, po której następuje sp. –

Odpowiedz

13

Jeśli format string zawsze będzie numer, a następnie przez niektórych znaków, a następnie spróbuj tego

mystr.split("[a-z]")[0] 
+0

krótkie i słodkie, idealne - dziękuję. –

+0

fajne rozwiązanie! – stratwine

+0

Spowoduje to awarię, jeśli zostanie podany pusty łańcuch i może wygenerować nieprawidłowe wyniki, jeśli zostanie podany ciąg znaków międzynarodowych – Jherico

1

Można użyć

Integer.valueOf("0" + "600sp".replaceAll("(\\d*).*", "$1")) 

Uwaga:

Z tego regex będzie można utrzymać tylko początkowe cyfry.


Edit: "0" + służy do awarii, gdy nie mam żadnych cyfr. Tks @jherico!

+0

Spowoduje to awarię, jeśli ciąg nie zawiera cyfr. – Jherico

+0

@jherico: tks! Naprawię. – Topera

6

W zależności od ograniczeń wprowadzanych przez użytkownika, najlepiej radzić sobie z wyrażeniem regularnym.

Pattern p = Pattern.compile("(\\d+)"); 
    Matcher m = p.matcher("600sp"); 
    Integer j = null; 
    if (m.find()) { 
     j = Integer.valueOf(m.group(1)); 
    } 

To wyrażenie regularne można przetłumaczyć jako „daj mi zestaw sąsiadujących cyfr na początku łańcucha, gdzie istnieje co najmniej 1 cyfra”. Jeśli masz inne ograniczenia, takie jak analizowanie liczb rzeczywistych w przeciwieństwie do liczb całkowitych, musisz zmodyfikować kod.

2

Aby uzyskać krótsze i mniej szczegółowe rozwiązanie, dodaj więcej kontekstu.

StringBuffer numbers = new StringBuffer(); 
for(char c : "asdf600sp".toCharArray()) 
{ 
    if(Character.isDigit(c)) numbers.append(c); 
} 

System.out.println(numbers.toString()); 

W świetle nowych informacji, ulepszone rozwiązanie:

Integer.valueOf("600sp".replace("sp","")); 
1

Jeśli ciąg znaków jest gwarantowany (tak jak mówisz) jako liczba całkowita, a po nim "sp", odradzam używanie bardziej ogólnego parsera wyrażeń regularnych, który akceptowałby również inne odmiany (które powinny być reje jako błędy).

Wystarczy przetestować, czy kończy się na "sp", a następnie przeanalizować podciąg bez dwóch ostatnich znaków.

+0

To bardzo dobry punkt. Dziękuję Thilo. –

2

Wiem, że na to pytanie już udzielono odpowiedzi, ale czy zastanawiałeś się nad java.util.Scanner? Wygląda na to, że idealnie pasuje do rachunku bez narzędzi regex lub innych, bardziej złożonych narzędzi.

Powiązane problemy