Odwracanie kolejności cyfr w liczbach oraz liter w ciągach tekstowych

by Marcin

Odwracanie kolejności cyfr w liczbach oraz liter w ciągach tekstowychDzisiaj będzie o odwracaniu kolejności wyrazów i znaków w ciągach tekstowych oraz cyfr w liczbach.

Przyznam, że w swojej codziennej pracy nie znalazłem jeszcze praktycznego zastosowania dla tego rodzaju „odwracanek”. Będzie to więc typowa „sztuka dla sztuki”. Pożytek z tego taki, że można sobie przetrenować wykorzystanie kilku formuł operujących na tekstach. Poza tym widziałem już Excela w tak dziwnych zastosowaniach, że wcale nie mogę wykluczyć, że ktoś praktycznie wykorzysta to, o czym za chwilę będę pisał.

Odwracamy liczby

Zacznijmy od liczb. Załóżmy, że chcesz odwrócić kolejność cyfr w liczbie 19 875, aby w rezultacie otrzymać 57 891. Wykorzystać możesz następującą formułę tablicową:

{=SUMA(FRAGMENT.TEKSTU(C3;WIERSZ(ADR.POŚR(„1:”&DŁ(C3)));1)*
10^(WIERSZ(ADR.POŚR(„1:”&DŁ(C3)))-1))}

gdzie C3 to oczywiście komórka zawierająca liczbę, w której chcesz odwrócić kolejność cyfr. Nie ma znaczenia czy liczba wpisana jest w formacie liczbowym, czy też jest to ciąg tekstowy (wykorzystywana funkcja FRAGMENT.TEKSTU i tak zamienia „po drodze” wartości liczbowe na tekst). Na rysunku poniżej możesz zobaczyć, że formuła zwraca ten sam wynik zarówno dla liczby (C3), jak i tekstu (C4).

Odwracanie kolejności cyfr w liczbach oraz liter w ciągach tekstowych

W formule wykorzystany jest powszechnie znany sposób „składania” liczb. Dla przykładu liczba 154 to inaczej jedna setka (1*100), 5 dziesiątek (5*10) oraz 4 jedności (4*1). Co można zapisać jako sumę:

1 * 10 2 + 5 * 10 1 + 4 * 10 0

Wszystko, co formuła robi to odwrócenie kolejność potęg dziesiątki, do postaci:

1 * 10 0 + 5 * 10 1 + 4 * 10 2

Także liczby niecałkowite

Skoro już byłem przy liczbach pomyślałem sobie, dlaczego nie spróbować z liczbami niecałkowitymi (z przecinkiem).

Zastosowanie wspomnianej powyżej formuły do takiego przypadku oczywiście zakończy się błędem (trudno zmusić Excela do wykonywania operacji arytmetycznych na przecinku). Dodatkowa trudność polega na tym, że nieco inaczej trzeba potraktować cyfry (w zasadzie odpowiadające im potęgi 10) znajdujące się przed i po przecinku.

Moja pierwsza myśl była taka, aby po prostu odseparować część całkowitą, odwrócić (wykorzystując formułę wspomnianą wyżej), a następnie dodać do niej odwróconą część ułamkową. Oczywiście można tak zrobić i wszystko zadziała, tyle tylko, że formuła, którą otrzymałem idąc tym tropem przeraziła mnie nieco swoją długością. Pokombinowałem więc jeszcze trochę z formułami i ostatecznie moje rozwiązanie wygląda następująco (formuła tablicowa).

{=SUMA(FRAGMENT.TEKSTU(PODSTAW(C7;”,”;””);WIERSZ(ADR.POŚR(„1:”&DŁ(PODSTAW(C7;”,”;””))));1)*
10^(WIERSZ(ADR.POŚR(„1:”&DŁ(PODSTAW(C7;”,”;””))))-SZUKAJ.TEKST(„,”;C7)))}

gdzie w C7 znajduje się liczba do odwrócenia.

Odwracanie kolejności cyfr w liczbach oraz liter w ciągach tekstowych

Podstawowa zasada działania formuły jest taka sama jak w przypadku formuły przedstawionej wcześniej (odwracanie liczby całkowitej). Każdą cyfrę liczby mnożymy przez 10 podniesione do odpowiedniej potęgi, a następnie sumujemy wyniki. Tyle tylko, że w tym przypadku, dla cyfr znajdujących się przed przecinkiem (po odwróceniu znajdą się po przecinku) zastosować trzeba ujemny wykładnik potęgi.

Prześledźmy całość na praktycznym przykładzie, dla liczby 124,97. Rozbiję formułę „na drobne” w celu lepszego wyjaśnienia zasady działania.

FRAGMENT.TEKSTU(PODSTAW(C17;”,”;””);WIERSZ(ADR.POŚR(„1:”&DŁ(PODSTAW(C17;”,”;””))));1)

Ten fragment pobiera po kolei wszystkie cyfry odwracanej liczby (pomijając przecinek). Cyfry pobierane są po kolei od lewej do prawej. W tablicy utworzonej w pamięci komputera znajdzie się odpowiednio: {1,2,4,9 i 7}.

Każda z tych cyfr będzie następnie mnożona przez 10 podniesione do odpowiedniej potęgi. Właśnie w określeniu tej potęgi leżał klucz do rozwiązanie problemu. Zasadnicze znaczenie ma tu, po której stronie przecinka znajduje się każda cyfra. Te, które w odwracanej liczbie znajduję się po lewej stronie (część całkowita) muszą stać się częścią ułamkową, a więc potęga powinna być dla nich ujemna.

(WIERSZ(ADR.POŚR(„1:”&DŁ(PODSTAW(C17;”,”;””))))-SZUKAJ.TEKST(„,”;C17))

Pierwsza część – WIERSZ(ADR.POŚR(„1:”&DŁ(PODSTAW(C17;”,”;””)))) – zwróci tablicę z kolejnymi cyframi, od 1 do 5. Od każdej cyfry w tej tablicy odejmowana jest następnie pozycja przecinka określona przy pomocy SZUKAJ.TEKST(„,”;C17). W naszym przypadku jest to „4”.

1 – 4 = -3
2 – 4 = -2
3 – 4 = -1
4 – 4 = 0
5 – 4 = 1

Wynik zapisywany jest w nowej tablicy utworzonej w pamięci komputera {-3, -2, -1, 0, 1}.
Są to oczywiście poszukiwane potęgi. Zwróć uwagę, że dla pierwszych trzech cyfr potęgi są ujemne, dzięki czemu część całkowita liczby stanie się częścią ułamkową.

W kolejnym kroku Excel przemnoży przez siebie tablicę z cyframi odwracanej liczby oraz tablicę z 10 podniesionym do potęgi (odpowiednio -3, -2, -1, 0, 1) i w rezultacie otrzymasz tablicę z liczbami:

1 * 10 -3 = 0,001

2 * 10 -2 = 0,02

4 * 10 -1 = 0,4

9 * 10 0 = 9

7 * 10 1 = 70

które, po zsumowaniu, dają wynik 79,421 czyli dokładnie to, o co nam chodziło.

Wygląda na to, że rozpisałem się bardziej niż planowałem. O odwracaniu kolejności wyrazów oraz liter w wyrazach napiszę więc następnym razem.

{ 11 comments… read them below or add one }

korowiowek

Cześć,

>formuła, którą otrzymałem idąc tym tropem przeraziła mnie nieco swoją długością

A mógłbyś może wrzucić te formułę na bloga ? Chętnie bym rzuckił okiem

Paweł

Nie wiem dlaczego, ale kiedy kopiuje Twoje formuly do excela wyrzuca mi blad. Uzywal excela 2007.Jakies sugestie ? Jestes pewien, ze formuly sa poprawne ?

pawel

P.S. Bloga swoja droga gratuluje

Marcin

Cześć Korowiowek,

>A mógłbyś może wrzucić te formułę na bloga ?

Bardzo chciałem tego uniknąć, ale skoro nalegasz …..oto mój potworek 🙂 Formuła tablicowa. „Połamałem” ja trochę enterem bo mi się w oknie komentarza nie chciała zmieścić (musisz więc zrobić z tego jeden ciąg)

=SUMA(FRAGMENT.TEKSTU(PRAWY(C17;DŁ(C17)-SZUKAJ.TEKST(„,”;C17));WIERSZ(ADR.POŚR(„1:”&
DŁ(PRAWY(C17;DŁ(C17)-SZUKAJ.TEKST(„,”;C17)))));1)*10^(WIERSZ(ADR.POŚR(„1:”&DŁ(PRAWY(C17;
DŁ(C17)-SZUKAJ.TEKST(„,”;C17)))))-1))+SUMA(FRAGMENT.TEKSTU(LEWY(C17;SZUKAJ.TEKST(„,”;C17)-1);
WIERSZ(ADR.POŚR(„1:”&DŁ(LEWY(C17;SZUKAJ.TEKST(„,”;C17)-1))));1)*10^(WIERSZ(ADR.POŚR(„1:”&
DŁ(LEWY(C17;SZUKAJ.TEKST(„,”;C17)-1))))-1))*10^-DŁ(LEWY(C17;SZUKAJ.TEKST(„,”;C17)-1))

Mimo wszystko sugeruję zastosować sposób jaki opisałem w tekście – o wiele krótszy i efekt ten sam.

Marcin

Łukasz

do Pawła

problem tkwi w znaczkach ” , które jakimś cudem nie kopiują się prawidłowo z tego bloga

po skopiowaniu formuły musisz je ręcznie skasować i nadpisać ponownie, wtedy zadziała prawidłowo

pzdr

Łukasz

azzaza

aCzy możesz mi wyjaśnić co to jest i jakim celu znajduje się w formule powyższej: ADR.POŚR(“1:”&DŁ(C3)) ??

Marcin

@azzaza

Tak w wielkim skrócie – konstrukcja, o którą pytasz używana jest do budowania (poruszając się cały czas w ramach wbudowanych funkcji Excela) swego rodzaju … pętli. W naszym przykładzie umożliwia ona pobieranie po kolei wszystkich znaków danego ciągu. Chcąc dokładnie wszystko zrozumieć musisz poczytać nieco o formułach tablicowych (jest u mnie na blogu tekst na ten temat, który wierzę wiele Ci wyjaśni. Odszukaj go sobie i dokładnie przeczytaj) oraz funkcjach Wiersz i Adr.Pośr.

Marcin

ADR.POŚR(“1:”&DŁ(C3))

zapytanie

Mam pytanie jak rozbić cyfrę np 123456789 na kolejne liczby 1 2 3 4 5 6 7 8 9 zapisane w kolejnych np kolumnach???

Altari

Nie prościej używać OpenOffice, który swoją drogą jest znacznie lepszy?
Tam to całe x-linijkowe odwracanie można zrobić jedną funkcją w Pythonie. I przy okazji wszystko jest zgodne z najnowszymi standardami i uniwersalne. Nie tak jak produkty Microsoftu.

luklek

witam, niestety odwracanie nie działa na liczbach zakończonych zerami, np. 1000, 20, 45000, czyli co 10 liczb; likwiduje zero. Jak wywołać 0 na początku tego ciągu? Łukasz

Dawid

Właśnie takiego rozwiązania szukałem;)
Sprzedaje części samochodowe od ludzi z różnych miejsc na świecie do różnych ludzi na świecie i odwracam część liczbową w towarze, żeby klienci nie mogli znaleźć towaru bezpośrednio od producenta 😉

np
oryginalny numer
ABC123456

Mój numer
ABC654321

dzięki temu jestem bezpiecznym handlowcem 😉

Dzięki za to rozwiązanie oszczędziłeś mi mnóstwo pracy, ja kombinowałem cały czas z funkcjami prawy lewy itd. ale było to w 1/3 automatyczne a 2/3 ręczna robota.
dzięki

P.S.
widać, że warto tworzyć sztukę dla sztuki a komuś się przyda

robert

Witam

Świetny blog. Ale ja mam jeszcze głupszy zadanie. Niestety wszelkie kombinacje mi nie służą.
Mam ciąg znaków (hex) i muszę odwrócić bitami od tyłu. Przykład.
0000D968 a muszę zrobić 68D90000. Jakiś pomysł? Pomocy

Leave a Comment

Previous post:

Next post: