Wątek przeniesiony 2015-06-05 20:31 z Newbie przez furious programming.

Zmiana stringa na wartość double

0

Cześć wszystkim ! Mam problem ze zmianą Stringa na Double. String może być w postaci: 100,2 ; 100.2 ; 100 ; 100,20.10 itd.
O ile z pierwszą sytuacją nie mam kłopotu stosuję: replace(",","."), to problem pojawia się jak mam przecinek i kropkę. Zmieniając 100,20.10 na kropki, przy parsowaniu na double źle parsuje. Macie pomysł jak to rozwiązać bez przechodzenia całego stringa i kombinowania z liczeniem kropek?

0

usun wszystkie kropki i przecinki i wtedy parsuj?
jesli musisz jednak brac je pod uwage to nie masz wyjscia, musisz napisac pare if'ow

0

http://stackoverflow.com/a/888105/1387438

Na wszelki wypadek wyjaśnij jakie masz dane wejściowe?
Źle je przepisałeś? Czy może naprawdę te dane są niekonsystentne (zmienia się separator dziesiętny i tysięcy)?
Stawiam na to pierwsze.

Najlepiej jakbyś ustalił jakiej lokalizacji używa twoje źródło danych (wstępnie można założyć, że zgodnego z ustawieniami systemowymi, w drugiej kolejność US).

0

Dokładniej zadanie polega na tym, że muszę z pliku tekstowego "powyciągać" waluty (waluty są w różnych lokalizacjach). Potem zapisać te wartości do bazy danych, a następnie wyświetlać wszystkie wartości w określonej przez użytkownika lokalizacji. Więc może jest tez jakiś inny sposób na obejście tego?

Nie mogę edytować, więc piszę tutaj. Plik tekstowy wygląda np tak:

100,89 PLN 4500,1 PLN 1,450.20 USD 200 PLN
0

Dawaj przykład tego pliku (dokładnie taki jaki dostajesz), by bez wątpliwości było widać o co chodzi.
Pod żadnym pozorem nie przepisuj tego ręczenie.
Im więcej dasz konkretów tym szybciej dostanie konkretną odpowiedź.

Tu masz dobry wątek na SO: http://stackoverflow.com/a/758378/1387438
Alternatywna odpowiedź też wygląda ciekawie.

Problem z EURO to już przerąbane, bo stosuje je wiele krajów, które mogą się różnić sposobem zapisu waluty.
Większość chyba stosuje przecinek jako separator dziesiętny, ale nie zdziwiłbym się jeśli byłby jakiś wyjątek.

Wygląda na to, że twój problem nie jest taki trywialny jak może się wydawać i wątek powinien opuścić dział newbie.

0

Skopiowane dwie linijki pliku tekstowego. Linii jest kilkadziesiąt bez sensu, żebym całość kopiował, reszta wartości jest bardzo podobna. Jak to ma działać opisałem wcześniej, ważne, żeby dane zapisywały się w bazie danych i dopiero z tej bazy był wyświetlane (jak pisałem wszystkie wartości trzeba wyświetlać w jednakowej lokalizacji, wybranej przez użytkownika).
http://pastebin.com/2dY25eNU

Ogólnie wszystko wiem jak zrobić, brakuje mi tylko pomysłu jak rozwiązać problem z tymi przecinkami oraz jak lepiej przechowywać w bazie (jako double czy jako string).

0

Masz tylko PLN i USD, czy będziesz miał więcej walut?

0

W tym pliku mam jeszcze dodatkowo EURO, ale mogę mieć różne pliki. Generalnie w założeniu każda waluta powinna być obsługiwana.

0

Jak wiesz, że masz mało walut i każda konkretna waluta, ma konkretny format (z określonej lokalizacji) to nie po prostu wklep twardo: skojarzenie waluty z Locale i użyj mojej pierwszej odpowiedzi.

Przy czym EURO to przerąbane, bo używa go wiele krajów i może się trafić kraj z innym formatem zapisu waluty.

1

Pomysł trochę na około, ale...
Jeśli Cię dobrze zrozumiałem to musisz podzielić każdego String'a 1,450.20 na pojedyncze znaki i wtedy:

  1. Pierwszy operator z prawej strony podejrzewamy, że jest separatorem dziesiętnym.
  2. Jeśli wybrany operator ma po swojej prawej stronie >= 3 liczby to jednak nie jest separatorem dziesiętnym.
public static void main(String[] args) {
        String przyklad[] = {"1,450.20","250,59","450,000","1.5","700.000,66"};
        for (String s : przyklad) {
            String poprawiony = getCorrectString(s);
            double wartoscSparsowana = Double.parseDouble(poprawiony);
            System.out.println("przed: "+s+" po: "+wartoscSparsowana);
        }
    }

    private static String getCorrectString(String s) {
        final int separatorIndex;

        separatorIndex = s.lastIndexOf(',') > s.lastIndexOf('.') ? s.lastIndexOf(',') : s.lastIndexOf('.');
        s = s.replace(',', ' ');
        s = s.replace('.', ' ');
        char[] a = s.toCharArray();
        if (separatorIndex > 0 && separatorIndex >= a.length-3) { //"a.length-3" patrz przykład "450,000"
            a[separatorIndex] = '.';
        }
        s = new String(a);
        s = s.replace(" ", "");
        return s;
    }

Mam nadzieję, że pomogłem ;)

edit: Niestety pomysł z przechodzeniem po Stringu, ale nie doczytałem pytania.

0

Co jesli trafi mu sie jen japonski i bedzie mial 4 cyfry po przecinku?
Ja bym najpierw sprawdzal ile masz kropek i przecinkow w liczbie. Jesli tylko jedna to zakladamy, ze oddziela grosze, centy itd. Jesli dwie to oddziela tysiace.

1

Prawda jest taka, że źródło danych jest popsute.
Efekt jest taki, że zawsze będzie jakiś warunek brzegowy utrudniający interpretację danych.
IMO najlepiej użyć informacji o walucie by w ten sposób wyciągnąć wnioski o formacie zapisu kwoty.
Poleganie na samej ilości wystąpień kropek i przecinków zawsze będzie prowadziło do błędnych interpretacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1