Sklejanie liczby z dwóch ciągów znaków

0

Witam Panowie!
Już mi kończą się pomysły. Potrzebuję zrobić coś takiego, że gdy w GetText(1) = 521511000 a w CSVParser.Row.Fields[1] = 1 to wyjdzie mi wartość 521511001

Próbowałem zrobić to w sposób następujący :

CSVParser.OpenFile(AFileName);

      OutputList.Clear;
      while not CSVParser.EOF do
      begin
        TempRow := '';

        Temp := GetText(1);
        Delete(Temp, Length(Temp) - 2, MaxInt);
        Temp := Temp + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]) - 2, MaxInt);

        TempRow := Temp + ',' +                                                  //NUM
                                                                             

Jednak gdy daję

Temp := Temp + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]) - 2, MaxInt);   

To zwraca mi wartość 5215111 Czyli bez dwóch zer.

Macie może jakieś pomysły jak z tego wybrnąć?

0

Np. Dolozyc dwa zera w pliku do jedynki.

0

To nie wchodzi w grę.

0

A co ma wyjść?

0

zamien to:

Temp := Temp + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]) - 2, MaxInt);

na to (pisane z glowy i brzydko):

       	case Length(CSVParser.Row.Fields[0]) of
         1:   Temp := Temp + '00' + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]), MaxInt);
         2:   Temp := Temp + '0' + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]) - 1, MaxInt);
         else Temp := Temp + Copy(CSVParser.Row.Fields[0], Length(CSVParser.Row.Fields[0]) - 2, MaxInt);
        end;   

PS. oczywiscie warto zapisac powtarzajacy sie kod do zmiennej, ale nie oszukujmy sie :)

0

Momento, chcesz dodawać liczby traktując je jak stringi?

0

@lampasss: słyszałeś o czymś takim jak StringOfChar? ;)

0
Temp[Length(Temp)]:=Chr(Ord('0')+CSVParser.Row.Fields[1] );

?
Może wyjaśnij dokładnie co chcesz otrzymać

0

Może podam na przykładach.
Jeżeli mam podaną wartość 152 987 000 i wczytam wartość 1 to wyjdzie mi 152 987 001.

Mam 152 987 000 i wczytuję 10 wychodzi 152 987 010

Mam 152 987 000 i wczytam 100 wyjdzie 152 987 100

Mam 152 987 000 i wczytam 1000 to wyjdzie 152 987 000

Jak widzisz głównie chodzi o 3 ostatnie liczby, które mam podmienić gdy wczytuję wartość. Z tym, że zwykłe copy nie zdaje egzaminu z tego powodu, że gdy wczytam wartość z jednej lub dwóch liczb to mi ucina zera. Dla przykładu :

Mam 152 987 000 i wczytuję 1 to wychodzi 152 987 1
Czyli jest źle w tym przypadku. Powinno wyjść 152 987 001

Może dało by się zrobić to jakoś z predefiniowaną wartością?
Coś takiego:
If (1) return (001)
If (2) return (002)
I tak dalej. Chyba, że myślę jakoś naokoło.

2

No bez jaj.
Jeśli chcesz dodać dwie liczby to po prostu je dodaj a nie kombinuj z jakimś sklejaniem.
Jeśli pierwsza liczba wygląda jak piszesz "XXX XXX XXX" to usuń spacje, potraktuj ją jako liczbę i dodaj drugą.
Jeśli jako wynik chcesz liczbę w formacie "XXX XXX XXX" to po działaniu matematycznym ponownie zamień ja na stringa umieszczając spacje co 3 cyfry.

0

Ale co to Free Pascal czy Delphi?
152 987 000 ten ciąg jest tak sformatowany (ze spacjami) i pierwsze 6 cyfr + spacja zawsze ma zostać a później chcesz do tego dodać jedną liczbę (o jest od razu liczba czy string?) poprzedzając ją zerami tak aby składała się zawsze z 3 cyfr?

0

Napisałem rozwiązanie ale kolega nie wie co z nim zrobic. Po drugie to nie jest dodawanie a zastąpienie znakow w stringu, nie musi byc zer na koncu. Chociaż nie znamy calych wymagan, przydalby się przykład bez zer na koncu liczby...

1
IntToStr(StrToInt(Temp)*1000+(StrToInt(CSVParser.Row.Fields[1] ) mod 1000));

To jest kod którego szukasz

0

@lampasss: Wiem gdzie to wkleić, taki głupi nie jestem. Nie działa ten kod który podałeś wcześniej.

@_13th_Dragon Niestety nie. Wychodzi mi coś takiego :

(123456(1

a powinno :

123456001

Dobra więc po kolei. Mam takie linie kodu które muszę wczytać :

(1,'Reverse STR(+1)',0,' 1',0,0,0,11,0,0,0,0,6000,4,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,0,12,12,12,0,10),
(2,'Reverse STR(+2)',0,' 2',0,0,0,11,0,0,0,0,6000,4,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,12,0,12,12,12,0,12),
(3,'Reverse STR(+3)',0,' 3',0,0,0,11,0,0,0,0,6000,4,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,12,0,12,12,12,0,15),
(4,'Reverse STR(+4)',0,' 4',0,0,0,11,0,0,0,0,6000,4,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,12,0,12,12,12,0,18),
(5,'Reverse STR(+5)',0,' 5',0,0,0,11,0,0,0,0,7000,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,14,0,14,14,14,0,20),
(6,'Reverse STR(+6)',0,' 6',0,0,0,11,0,0,0,0,7000,4,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,14,0,14,14,14,0,24),
(7,'Reverse STR(+7)',0,' 7',0,0,0,11,0,0,0,0,7000,4,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,14,0,14,14,14,0,28),
(8,'Reverse STR(+8)',0,' 8',0,0,0,11,0,0,0,0,7000,4,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,14,0,14,14,14,0,31),
(9,'Reverse STR(+9)',0,' 9',0,0,0,11,0,0,0,0,7000,4,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,14,0,14,14,14,0,34),
(10,'Reverse STR(+10)',0,' 10',0,0,0,11,0,0,0,0,7000,4,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,14,0,14,14,14,0,37),

W tym przypadku chodzi nam tylko i wyłącznie o pierwszą wartość to jest : 1,2,3,4,5,6,7,8,9

Przed wczytaniem wyżej wymienionych linii z kodu predefiniuję wartość która jest wartością bazową dajmy na to : 123999000

Z obecnym kodem w programie wyszło by mi następująco: 1239991, 1239992, 1239993, 1239994, 1239995, 1239996, 1239997, 1239998, 1239999, 12399910

*To nadal jest ciąg liczb, po prostu zaznaczyłem poprzez "instrukcję kodu" (na czerwono) żeby było wiadome na czym się skupić.
Jak widzicie w przykładzie wartość składa się z XXX XXX XXX - 9 Liczb, a zwraca mi 7 liczb

Gdybym dodał zera na początku wartości z kodu to wszystko wyjdzie tak jak trzeba:

(001,'Reverse STR(+1)',0,' 1',0,0,0,11,0,0,0,0,6000,4,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,0,12,12,12,0,10),
(002,'Reverse STR(+2)',0,' 2',0,0,0,11,0,0,0,0,6000,4,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,12,0,12,12,12,0,12),
(003,'Reverse STR(+3)',0,' 3',0,0,0,11,0,0,0,0,6000,4,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,12,0,12,12,12,0,15),
(004,'Reverse STR(+4)',0,' 4',0,0,0,11,0,0,0,0,6000,4,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,12,0,12,12,12,0,18),
(005,'Reverse STR(+5)',0,' 5',0,0,0,11,0,0,0,0,7000,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,14,0,14,14,14,0,20),
(006,'Reverse STR(+6)',0,' 6',0,0,0,11,0,0,0,0,7000,4,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,14,0,14,14,14,0,24),
(007,'Reverse STR(+7)',0,' 7',0,0,0,11,0,0,0,0,7000,4,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,14,0,14,14,14,0,28),
(008,'Reverse STR(+8)',0,' 8',0,0,0,11,0,0,0,0,7000,4,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,14,0,14,14,14,0,31),
(009,'Reverse STR(+9)',0,' 9',0,0,0,11,0,0,0,0,7000,4,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,14,0,14,14,14,0,34),
(010,'Reverse STR(+10)',0,' 10',0,0,0,11,0,0,0,0,7000,4,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,14,0,14,14,14,0,37),

Z tych linii wyjdzie mi to co podałem w przykładzie czyli : 123999001, 123999002, 123999003, 123999004 , 123999005, 123999006, 123999007. 123999008. 123999009 , 123999010 i wszystko jest ok.

Z tym, że te linie co podałem to jest tylko wierzchołek góry lodowej. Jest tego znacznie więcej i jakbym miał ręcznie dodawać za każdym razem te dwa czy jedno zero to zajęło by mi to na prawdę dużo czasu.

Może jest taka możliwość żeby jakoś zdefiniować, że jeżeli pierwsza liczba występuje sama : na przykład 1, to doda mi przed jedynkę dwa zera i wyjdzie 001.

Jeżeli wartość w polu numer 1 ma dwie liczby na przykład: 10 to program doda mi jedno zero przed czyli wyjdzie 010

Mam nadzieję , że tym razem wszystko dobrze wytłumaczyłem.

0

Dodam trzy grosze...
Jeśli to Delphi i to w miarę nowe, a danych będzie sporo, to należy unikać takiej rzeźby na stringach.
Zamiast tego mamy klasę TStringBuilder, która właśnie do tego służy i działa... lepiej.

0
wynik_jako_string := IntToStr(StrToInt(wartosc_bazowa_jako_string) + StrToInt(Copy(CSVParser.Row[indeks linii], 2, Pos(',',CSVParser.Row[indeks linii]-1))));
  1. zamieniasz wartość bazową na integer (jeśli jest to string),
  2. kopiujesz z pojedynczej linii od pozycji 2 (pierwsza za nawiasem bo liczymy od 1) do pozycji pierwszego przecinka (minus 1 żeby nie kopiować przecinka), w ten sposób nie ważne jaka będzie wartość po nawiasie,
  3. konwersja skopiowanej wartości na Integer,
  4. sumujesz wartości zgodnie z zasadami matematyki,
    5.jeśli trzeba to konwersja na stringa.

Nie zapomnij o obsłużeniu wyjątków.

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