algorytm.org

Zamiana liczby na słowa



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Zamiana liczby na słowa
Ocena użytkowników:***** / 16
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 27 lipca 2005 19:20

Częstym problemem w przypadku pisania aplikacji finansowych i księgowych jest zamiana zapisu liczbowego na postaś słowną. Czasem robi się w sposób dość prymitywny zapisując trzy lub cztery pierwsze znaki liczby. Wygląda to następująco:
Definiuje się tablicę tab[0..9] o kolejnych elementach odpowiednio zer, jed, dwa, trz, czt, pie, sze, sie, osi, dzi. Zamiana z liczby na postać słowną odbywa się następująco. Niech w zmiennej liczba znajduje się liczba do zamiany na słowa, zmienna slownie bedzie zawierac wynik.

dopóki liczba jest większa od zero wykonuj kolejno:
  • koncowka = liczba mod 10
  • liczba = liczba div 10
  • slownie = tab[koncowka] + slownie

Przykład:

liczba=17653
1) koncowka=17653 mod 10 = 3, liczba=liczba div 10 =1765, slownie=tab[koncowka]+slownie=tab[3]+slownie=' trz'
2) koncowka=1765 mod 10 = 5, liczba=liczba div 10 =176, slownie=tab[koncowka]+slownie=tab[5]+' trz'='pie trz'
3) koncowka=176 mod 10 = 6, liczba=liczba div 10 =17, slownie=tab[koncowka]+slownie=tab[6]+' pie trz'='sze pie trz'
4) koncowka=17 mod 10 = 7, liczba=liczba div 10 =1, slownie=tab[koncowka]+slownie=tab[7]+' sze pie trz'='sie sze pie trz'
5) koncowka=1 mod 10 = 1, liczba=liczba div 10 =0, slownie=tab[koncowka]+slownie=tab[1]+' sie sze pie trz'=' jed sie sze pie trz'
6) liczba = 0 koniec, wynik to 'jed sie sze pie trz' odpowiadający liczbie 17653
Wyżej opisany sposób zamiany jest jednak mało elegancki, nam zależałoby na tym bym zamiana odbywała się na formę czytaną liczby. W tym celu zdefiniujemy sobie następujące tablice:
jednosci[0..9] o wartościach odpowiednio '', ' jeden', ' dwa', ' trzy', ' cztery', ' piec', ' szesc', ' siedem', ' osiem', ' dziewiec'
nascie[0..9] o wartościach ' dziesiec', ' jedenascie', ' dwanascie', ' trzynascie', ' czternascie', ' pietnascie', ' szesnascie', ' siedemnascie', ' osiemnascie', ' dziewietnascie'
dziesiatki[0..9] o wartościach '', ' dziesiec', ' dwadziescia', ' trzydziesci', ' czterdziesci', ' piecdziesiat', ' szescdziesiat', ' siedemdziesiat', ' osiemdziesiat', ' dziewiecdziesiat'
setki[0..9] o wartościach '', ' sto', ' dwiescie', ' trzysta', ' czterysta', ' piecset', ' szescset', ' siedemset', ' osiemset', ' dziewiecset'
rzedy_wielkosci[0..5] o wartościcach odpowiednio '', ' tys.', ' mln.', ' mld.', ' bln.', ' bld.'
Algorytm bazuje na prawidlowosci, że każda liczba sklada się z trzy cyfrowych elementow oddzielonych rzędami wielkości, np.: 23 416 118. Zamiana przebiega następująco (na początku j=1):

dopóki liczba jest większa od zero wykonuj kolejno:
  • koncowka = liczba mod 10
  • liczba = liczba div 10
  • jeżeli j=1 i (liczba mod 100 <> 0 lub koncowka <> 0) to wówczas slownie=rzad_wielkosci[rzad]+slownie
  • jeżeli j=3 to slownie=setki[koncowka]+slownie, j=0, rzad=rzad+1
  • jeżeli j=2 to slownie=dziesiatki[koncowka]+slownie
  • jeżeli j=1 i liczba mod 10 <> 1 to slownie=jednosci[koncowka]+slownie
  • jeżeli j=1 i liczba mod 10 = 1 to slownie=nascie[koncowka]+slownie, liczba=liczba div 10, j=j+1
  • j=j+1;


Przykład:

liczba=12000587
1) rzad=0, j=1, koncowka=12000587 mod 10 =7, liczba=liczba div 10 =1200058, slownie=rzad_wielkosci[0]+slownie='', slownie=jednosci[7]+slownie=' siedem'
2) rzad=0, j=2, koncowka=1200058 mod 10 =8, liczba=liczba div 10 =120005, slownie=dziesiatki[8]+slownie=' osiemdziesiat siedem'
3) rzad=0, j=3, koncowka=120005 mod 10 =5, liczba=liczba div 10 =12000, slownie=setki[5]+slownie=' pięćset osiemdziesiąt siedem'
4) rzad=1, j=1, koncowka=12000 mod 10 =0, liczba=liczba div 10 =1200, slownie=jednosci[0]+slownie=' pięćset osiemdziesiąt siedem'
5) rzad=1, j=2, koncowka=1200 mod 10 =0, liczba=liczba div 10 =120, slownie=dziesiatki[0]+slownie=' pięćset osiemdziesiąt siedem'
6) rzad=1, j=3, koncowka=120 mod 10 =0, liczba=liczba div 10 =12, slownie=setki[0]+slownie=' pięćset osiemdziesiąt siedem'
7) rzad=2, j=1, koncowka=12 mod 10 =2, liczba=liczba div 10 =1, slownie=rzad_wielkosci[2]+slownie='mln. pięćset osiemdziesiąt siedem', slownie=nascie[2]+slownie=' dwanaście mln. pięćset osiemdziesiąt siedem'
8) rzad=2, j=3, liczba=0, koniec wynikiem jest łańcuch 'dwanaście mln. pięćset osiemdziesiąt siedem' odpowiadający liczbie 12000587

W algorytmie tym należy osobno rozpaczyć przypadek dla liczby 0. Dla liczb ujemnych wystarczy odwrócić znak (zmienić ją na dodatnią), wykonać dla niej algorytm, a następnie dodać łańcuch 'minus' na początek zmiennej slownie.

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 13
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 3
Tomasz LubińskiJava
.java
.java
***** / 5
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 09 czerwca 2011 21:31
Komentarze
photo
+1 # Mareczny 2010-11-11 14:27
przydałoby się rozszerzyć tablice rzedy_wielkosci [0..5,0..2] do postaci obsługującej odmianę: tysiąc, tysiące, tysięcy
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Tomasz Lubiński 2010-11-12 15:21
Sposób zamiany liczby na postać słowną z uwzględnieniem polskiej gramatyki opisany jest w artykule www.algorytm.org/inne/zamiana-liczby-na-slowa-z-polska-gramatyka.html
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Zenek 2011-12-15 18:36
Po pierwsze, to tam nie ma algorytmu zaimplementowan ego w Javie, a po drugie: mógłbyś używać StringBuilder.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Tomasz Lubiński 2015-08-25 12:07
Implementacja w Javie jest już dostępna.
Jeżeli chodzi o StringBuilder to rzeczywiście jest on lepszym rozwiązaniem (pod względem zajętości pamięci i prędkości działania programu) ale dla części początkujących osób mógłby być trudniejszy do zrozumienia.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz