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.
A nie odwrotnie jest? W każdym razie możesz zrobić konwersje na string i zamienić każde wystąpienie ',' na '.'
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");
A nie lepiej użyć do tego calcedit i wtedy przecinek czy kropka zależą od lokalizacji systemu.
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
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.
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 :)
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.
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ę.
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.
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.
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 :(
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.
Temat można zamknąć