C++ 6 Builder zamiana formatu liczb

0

Witam,
Chciałem się zapytać jak zamienić w zmiennej Float bądź Double przecinki na kropki.
Domyślnie liczby mają cyfry po przecinku (np: 87,456), a mi chodzi tylko o to by zamiast tego był wyświetlane kropki (np:87.456).
Z góry dziękuję za pomoc.

0

A nie odwrotnie jest? W każdym razie możesz zrobić konwersje na string i zamienić każde wystąpienie ',' na '.'

0

Właśnie nie, po wyświetleniu tego w RichEdit widać że liczby są przecinkowe.

Czyli zamienić to za pomocą AnsiString. Za pomocą jakiej komendy zamieniać w każdej linii (ponieważ jest to pętla) przecinki na kropki?

Póki co wygląda to tak: RichEdit1->Lines->Add(AnsiString(longitude) + "," + AnsiString(latitude) + ",0");

0

A nie lepiej użyć do tego calcedit i wtedy przecinek czy kropka zależą od lokalizacji systemu.

0

Ma to być prosty konwerter który zamienia zawartość pliku .txt na .kml, na zaliczenie z przedmiotu.
Cały konwerter działa tylko właśnie w pliku .kml potrzebne są kropki w współrzędnych a nie przecinki.

Sam osobiście jestem zielony w środowisku c++ i calcedit mi nic nie mówi :P

0

Tak na szybko. Mogłem zrobić jakiś błąd:

string longitude = AnsiString(longitude);
int position = longitude.find(',');
longitude = longitude.erase(position, 1).insert(position+1, '.';
string latitude = AnsiString(latitude)
 RichEdit1->Lines->Add(longitude + "," + latitude + ",0");

To samo trzeba zrobić z latitude.

0

Super, dzięki wielkie. Zaraz to sprawdzę, w międzyczasie znalazłem inne rozwiązanie, ale też działa :D

AnsiString szerokosc=FloatToStr(latitude);
        szerokosc=StringReplace(szerokosc,",",".",TReplaceFlags());
        AnsiString dlugosc=FloatToStr(longitude);
        dlugosc=StringReplace(dlugosc,",",".",TReplaceFlags());
        AnsiString pozycja=dlugosc+","+szerokosc;
RichEdit1->Lines->Add(pozycja);

Dzięki jeszcze raz :)

0
Gorący Kret napisał(a):

Ma to być prosty konwerter który zamienia zawartość pliku .txt na .kml, na zaliczenie z przedmiotu.
Cały konwerter działa tylko właśnie w pliku .kml potrzebne są kropki w współrzędnych a nie przecinki.

Sam osobiście jestem zielony w środowisku c++ i calcedit mi nic nie mówi :P

Coś mi się wydaje, że zły problem rozwiązujemy ;) Co to za współrzędne i dlaczego mają tam być kropki ? Może to co zrobiliście działa, ale nie koniecznie jest to poprawne i zgodne z kunsztem programistycznym.

0

To ma być konwerter który odczytuje depeszę GPS (plik tekstowy), wybiera z poszczególnych linii pozycję i zapisauje to jako plik KML (do odczytania w Google Earth).

W pliku KML występują kropki a nie przecinki w współrzędnych dlatego potrzebna była zamiana. Jedyny problem jaki mi pozsotał to dlaczego gdy teoretycznie zapisauję gotowy plik w formacie *.kml (w filtrze savedialog1 tak ustawiłem), to zapisuje mi plik ale bez żadnego rozszerzenia :/

Mam nadzieję, że do tego dojdę.

0

Ok, a co do tego ma RichEdit ? Powinieneś mieć klasę współrzędnych. Klasa pliku powinna zawierać kolekcje obiektów klasy współrzędna. Dalej powinieneś mieć property którym pobierzesz wartość współrzędnej do RichEdit czy TextEdit etc. a osobna funkcja powinna serializować współrzędne etc. do pliku. Chyba, popełniona została tutaj niezła kołomyja.

0

Program wygląda w ten sposób że po wczytaniu pliku Depeszy jego zawartość wyświetla się w pierwszym oknie Memo1.
Potem przekonwertowana treść wyświetla się w oknie RichEdit1 - myślę, że równie dobrze mogłoby być Memo2. Na zajęciach używaliśmy obu form, a główną różnicą między nimi z tego co przeczytałem (w necie oczywiście bo na zajęciach g**no powiedzą) jest ich pojemność i że w RichEdit można edytować tekst.

0

Jeśli jesteś ciekawy to oto mój mały programik, a w zasadzie jego główna część już z moimi komentarzami.

 int lat_s, lon_s;                      //Zadeklarowanie zmiennych
float  latitude, longitude;
double czas, lat_m, lon_m;
char lat_z, lon_z;

AnsiString poczatek = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n<Document>";
Memo2->Lines->Add(poczatek);
                                                             //Wczytanie poczatku pliku kml

for(int i = 0; i<=Memo1->Lines->Count; i++)
 {
 AnsiString linia = Memo1->Lines->Strings[i];               //Petla for ktora bedzie odczytywac plik linia po linii az do konca pliku
 char* linia_char = linia.c_str();

  if(strstr(linia_char, "GPGGA") !=NULL)                     //Wyszukuje linie ktore zawieraja GPGGA
  {
  sscanf(linia_char, "$GPGGA,%lf,%2d%lf,%c,%3d%lf,%c", &czas, &lat_s, &lat_m, &lat_z, &lon_s, &lon_m, &lon_z);   //Skanuje linie i odczytuje z nich zmienne

        if(lat_z=='N')
        latitude=lat_s+(lat_m/60.0);
        else
        latitude=-(lat_s+(lat_m/60.0));         //Zamiana szerokosci na same stopnie

        if(lon_z=='E')
        longitude=lon_s+(lon_m/60.0);
        else
        longitude=-(lon_s+(lon_m/60.0));        //Zamiana dlugosci na same stopnie

        AnsiString szerokosc=FloatToStr(latitude);
        szerokosc=StringReplace(szerokosc,",",".",TReplaceFlags());
        AnsiString dlugosc=FloatToStr(longitude);
        dlugosc=StringReplace(dlugosc,",",".",TReplaceFlags());
        AnsiString pozycja=dlugosc+","+szerokosc;                          //Zamiana przecinkow w liczbach na kropki

        Memo2->Lines->Add("<Placemark><name>Simple placemark</name><description>Punkt z depeszy gps</description><Point><coordinates>");
        Memo2->Lines->Add(pozycja);               //Zapisywanie kazdej pozycji z linii po kolei jako punkt pliku kml
        Memo2->Lines->Add("<</coordinates></Point></Placemark>");
  }
 }
Memo2->Lines->Add("<</Document></kml>");       //Zamkniecie pliku kml
}

Zamieniłem RichEdit na Memo, lecz to nie rozwiązało mojego problemu z zapisem niestety :(

0

Jeśli ktokolwiek jeszcze jest zainteresowany tematem, to dla wiadomości:

problem z zapisem polegał na tym, że w savedialog1 we właściwościach pole DefaultExt było puste, a powinna być gwiazdka jeśli zapisywałem w formacie *.kml.

0

Temat można zamknąć

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