Uwaga: przeglądasz tę stronę na urządzeniu o niewielkim ekranie (szerokość < 640px). Niektóre zamieszczone w artykule ilustracje i animacje mogą stać się nieczytelne po dopasowaniu ich do rozdzielczości tego ekranu.
Yestok.pl
Jerzy Moruś
© Wszystkie prawa zastrzeżone. Wykorzystanie całości serwisu lub jego fragmentów bez pisemnej zgody autora zabronione.
Liczba słowami III.
Opracowanie powstało z wykorzystaniem wersji oprogramowania istniejącej w trakcie jego pisania. Był to LibreOffice 7.5.9.
Rzymska liczba III w tytule tego opracowania oznacza, że jest to już trzeci artykuł poświęcony temu tematowi. Poprzednie dwa dotyczyły prezentowania liczb słowami w programie Calc w wersjach Apache OpenOffice i LibreOffice. To opracowanie dotyczy jednak wyłącznie pakietu LibreOffice od wersji 7.5. a zastosowane rozwiązanie można wykorzystać w programach Writer i Calc.
Pierwsze, najstarsze opracowanie (umieszczone w serwisie w 2012 roku), polegało na wykorzystaniu utworzonego przeze mnie arkusza, który po włączeniu do własnego skoroszytu pozwalał uzyskać wynik w postaci słownej (to opracowanie jest do przeczytania tutaj.). Założeniem dla tego rozwiązania było to, aby skoroszyt nie korzystał z makr. Jego niedogodnością było, że dla każdej liczby przedstawianej słowami należało użyć dedykowanej kopii tego arkusza. Drugie opracowanie dotyczące tego tematu pojawiło się w 2013 roku i dotyczyło napisanego przez węgierskiego programistę, László Németha, rozszerzenia uzupełniającego program Calc o dwie nowe funkcje: NUMBERTEXT() i MONEYTEXT() (to drugie opracowanie można przeczytać tu.). W tym rozwiązaniu, aby zachować możliwość otwierania pliku na innych komputerach, należało w każdym z nich zainstalować to rozszerzenie. Miałem przyjemność zostać zaliczonym w poczet współpracowników, gdyż dla obu funkcji przygotowałem polską wersję językową okienek dialogowych. Obie powyższe metody są nadal jedynymi do zastosowania w pakiecie Apache OpenOffice i starszych, niż 7.5, wersjach LibreOffice i dotyczą tylko programu Calc.
Nowy format liczbowy.
László Németh zaproponował wprowadzenie nowego formatu liczbowego, w którym liczby będą prezentowane jako tekst, dzięki czemu, to formatowanie liczb decyduje o ich prezentacji w dokumencie. Mechanizm formatowania liczb jest wykorzystywany także we Writerze, a to sprawia, że liczby przedstawiane słownie mogą pojawiać się automatycznie także w dokumentach tekstowych.
Nowy format został dodany do kategorii „Liczba” oraz „Waluta”, w zakładce „Liczby”, okna dialogowego „Formatuj komórki” w postaci trzech nowych wpisów. To zmienione okno dla kategorii „Liczba” przedstawia poniższa ilustracja.
W zakreślonym prostokącie znajdują się nowe formaty liczbowe.
- sto – symbolizuje zapis liczbowy małymi literami;
- Sto – symbolizuje zapis liczbowy, który rozpocznie się wielką literą;
- STO – symbolizuje zapis liczbowy wielkimi literami.
W kolejnym zakreślonym prostokącie można zobaczyć przypisany pozycji „sto” kod formatu w postaci [NatNum12 cardinal]0. Te nowe formaty liczbowe wykorzystują modyfikator formatu [NatNum12] i są formatami wbudowanymi w oprogramowanie, to znaczy, że nie można ich usunąć.
W kategorii „Waluta” wbudowano dwie pary kodów formatowania walutowego. Jedna para prezentująca tekst małymi literami – druga wielkimi, a w obrębie każdej pary, jeden kod dla liczby całkowitej a drugi dla liczby z miejscami po przecinku. Zastosowany w formatowaniu kod waluty zależy od ustawionej opcji „Język” w tej zakładce.W opracowaniu poświęconym formatowaniu liczb (https://yestok.pl/ooo/y55.php#y55g) świadomie pominąłem omawianie modyfikatorów [NatNumN] i związanych z nimi dodatkowych oznaczeń. Te modyfikatory istniały, i w poprzednich wersjach LibreOffice było ich 12, od [NatNum0] do [NatNum11]. Tyle zresztą nadal jest ich w Apache OpenOffice. Umożliwiają one, najogólniej mówiąc, wykorzystanie w prezentowanej liczbie rodzimych znaków cyfr. W Polsce i w większości krajów liczby przedstawiane są za pomocą cyfr arabskich, lecz w wielu językach cyfry mają własne symbole. Poniżej przykładowa prezentacja liczby 4096 w językach: japońskim, tajskim i bengalskim. Do sformatowania tych liczb wykorzystałem modyfikator [NatNum1] oraz kod kraju.
Modyfikator [NatNum12] jest nowym modyfikatorem, który został dodany do aplikacji LibreOffice właśnie w celu przedstawienia liczby w postaci słownej. Jest bardziej rozbudowany, niżby wynikałoby to z tych trzech pozycji umieszczonych w oknie dialogowym formatowania. Formalnie ogólną postacią tego modyfikatora jest postać [NatNum12 parametr_redakcyjny parametr_bazowy] i w takiej kolejności należy te parametry podawać.
Zanim omówię go bardziej szczegółowo, zwracam uwagę na to, że jest to tylko modyfikator, zatem po nim należy zawsze wprowadzić właściwy kod formatowania liczby. W przykładzie na ilustracji cyfra zero sygnalizuje formatowanie liczby jako liczby całkowitej. Dodam też od razu, że każda modyfikacja kodu (np. dodanie zer prowadzących lub miejsc po przecinku) lub zmiany dokonane wewnątrz modyfikatora traktowane są jak utworzenie formatu użytkownika.
Formaty zakwalifikowane jako kod użytkownika można usuwać z arkusza. W sekcji „Kod formatu” okna dialogowego pokazanego na rys. 1. uaktywnia się ostatni po prawej stronie przycisk, z charakterystycznym czerwonym krzyżykiem, pozwalający usunąć zadeklarowany format.
Modyfikator [NatNum12] może wykorzystać dwa parametry decydujące o postaci wyniku słownego, nazwałem je parametrem redakcyjnym oraz parametrem bazowym. Wszystkie parametry, z wyjątkiem kodów waluty, o czym mowa jest poniżej, muszą być wpisywane małymi literami.
Parametr bazowy.
Parametr bazowy określa, jaka postać gramatyczna liczebnika ma zostać zastosowana. Można użyć następujących wartości:
- „cardinal” (ta wartość jest jednocześnie wartością domyślną w przypadku pominięcia tego parametru) – oznaczającą, że będzie to liczebnik główny. Przy kodzie formatowania [NatNum12 cardinal]0 liczba 1,05 zostanie przedstawiona słowem „jeden", 18,1 zostanie przedstawiona słowem „osiemnaście”, 104,5 zostanie przedstawiona słowami „sto pięć” natomiast przy kodzie formatowania [NatNum12 cardinal]0,00 te same liczby zostaną przedstawione słowami: „jeden przecinek zero pięć”, „osiemnaście przecinek dziesięć”, „sto cztery przecinek pięćdziesiąt”.
- Kod waluty (musi to być trzyliterowy międzynarodowy kod waluty podany wielkimi literami, np. PLN dla Polski, GBP dla Wielkiej Brytanii, albo EUR dla krajów strefy euro) – oznaczającą, że będzie to liczebnik główny wartości kwotowej podany z określeniem waluty. Zatem przy kodzie formatowania [NatNum12 PLN]0 liczba 1,05 zostanie przedstawiona słowami „jeden złoty”, 18,1 zostanie przedstawiona słowami „osiemnaście złotych”, 104,5 zostanie przedstawiona słowami „sto pięć złotych”. Przy kodzie formatowania [NatNum12 PLN]0,00 te same liczby zostaną przedstawiona słowami: „jeden złoty pięć groszy”, „osiemnaście złotych dziesięć groszy”, „sto cztery złote pięćdziesiąt groszy”.
- „ordinal” – oznaczającą, że będzie to liczebnik porządkowy rodzaju męskiego. Przy kodzie formatowania [NatNum12 ordinal]0 liczba 1 zostanie przedstawiona słowem „pierwszy”, 18 – słowem „osiemnasty”, 105 – słowami „sto piąty”.
- „ordinal-feminine” – oznaczającą, że będzie to liczebnik porządkowy rodzaju żeńskiego. Dla liczb z powyższego przykładu będą to słowa odpowiednio: pierwsza, osiemnasta, sto piąta.
- „ordinal-neuter” – oznaczająca, że będzie to liczebnik porządkowy rodzaju nijakiego. Dla podanych liczb będą to słowa odpowiednio: „pierwsze”, „osiemnaste”, „sto piąte”.
- „ordinal-number” – oznaczającą, że będzie to liczebnik porządkowy przedstawiony cyframi ze znakiem kropki na końcu. Dla wspomnianych wyżej liczb byłyby to zapisy: 1., 18. i 105.
Liczebniki porządkowe dotyczą tylko liczb całkowitych. Jeśli w kodzie liczby podanym po modyfikatorze [NatNum12] pojawią się miejsca po przecinku, liczba zostanie przedstawiona cyframi z kropką w miejscu przecinka i zaokrąglonym odpowiednio wynikiem. Jeżeli parametry modyfikatora zostaną podane w niewłaściwej kolejności albo błędnie napisane, nie będzie żadnej sygnalizacji błędu lecz liczba zostanie przedstawiona tak jak opisałem powyżej. Prezentacja wyniku dotyczy zawsze wartości zaokrąglonej zgodnie z kodem formatowania podanym po modyfikatorze.
Zwracam tu uwagę na to, że tak prezentowana wartość komórki lub pola, jest nadal liczbą, a nie tekstem. Taka komórka lub pole może zostać wskazana jako argument formuły w dalszych obliczeniach.
Oddana do użytkowania wersja nie jest niestety pozbawiona błędów. Problemem są liczebniki porządkowe 2. i 3. oraz wszystkie porządkowe zakończone cyframi 2 i 3, wyłączając z nich liczby kończące się cyframi 12 lub 13. W przypadku liczebników zakończonych cyfrą 2, w rodzaju nijakim pojawia się tekst „druge” zamiast „drugie” natomiast gdy ostatnią cyfrą jest 3, w rodzaju żeńskim pojawia się tekst „trzeca” zamiast „trzecia”, a w rodzaju nijakim – „trzece” zamiast „trzecie”. Błąd ten zgłosiłem już twórcom programu. Zobacz uzupełnienie na końcu opracowania. Nawiasem mówiąc, w tego rodzaju liczebnikach jest więcej błędów, zwłaszcza przy prezentacji dużych liczb, lecz na szczęście takie liczby rzadko prezentowane są jako liczebniki porządkowe. Oto kilka przykładów:
- 24677 zostanie przedstawiona słowami: dwudziesty cztery tysiące sześćset siedemdziesiąty siódmy.
- 31980 zostanie przedstawiona słowami: trzydziesty jeden tysięcy dziewięćset osiemdziesiąty.
- 789562 zostanie przedstawiona słowami siedemset osiemdziesiąty dziewięć tysięcy pięćset sześćdziesiąty drugi.
Problem wynika z przyjęcia przez programistów zbyt uproszczonego schematu tworzenia takich liczebników w języku polskim, czemu sprzyjają niejednoznaczne zasady ich tworzenia. Zainteresowanych tym problemem odsyłam do eseju pana Tomasza Marka pod tym adresem https://www.jezykowedylematy.pl/2016/04/tomasz-marek-liczebniki-porzadkowe/ [dostęp dn. 17.08.2023].
Parametr redakcyjny.
Ten parametr decyduje o prezentacji tekstu wynikowego. Jeśli zostanie zastosowany, musi wystąpić przed parametrem bazowym. Parametr redakcyjny może przyjąć wartość:
- „lower” (ta wartość jest jednocześnie wartością domyślną w przypadku pominięcia tego parametru) – oznaczającą, że słowny tekst będzie napisany małymi literami.
- „upper” – oznaczającą, że słowny tekst będzie napisany wielkimi literami.
- „capitalize” – oznaczającą, że słowny tekst rozpocznie się wielką literą.
- „title” – oznaczającą, że każde słowo tekstu rozpocznie się wielką literą.
Calc.
Formatowanie liczby wymaga takiego ustalenia szerokości komórki, aby mogła wyświetlić się cała postać liczby. Jeśli prezentacja liczby nie mieści się w obszarze komórki, pojawi się ciąg znaków „###”. Ta zasada obowiązuje we wszystkich formatowaniach, a to oznacza, że jedynie krótkie teksty wynikowe mają szansę zmieścić się w standardowej szerokości komórki. Szerokość kolumny świeżo otwartego arkusza pozwala wpisać, bez przekroczenia granicy komórki, około 11 znaków o 10 punktowej wielkości. Najkrótszy – bo trzyliterowy – tekst utworzą tylko dwie liczby: 2 i 100 i o ile w takiej standardowej komórce liczba 103 zostanie przedstawiona jako tekst „sto trzy” to już liczba 18 zostanie przedstawiona w postaci „###”,.
Na prezentowanie wyniku nie wpłynie opcja formatowania pozwalająca zawijać tekst w komórce, gdyż z punktu widzenia arkusza w komórce znajduje się liczba, tylko że wyświetlana w taki wybrany sposób. W związku z tym należy na tyle poszerzyć komórkę, aby wynik pojawił się w całości. Sęk w tym, że trzeba byłoby to przewidzieć dla najdłuższego spodziewanego tekstu, a ta przecież nie zależy od wartości liczbowej.
Próba oszacowanie długości wynikowego tekstu za pomocą funkcji DŁ() [LEN()] zastosowana w stosunku do komórki tak sformatowanej zwróci długość zapisu cyfrowego, a nie wyniku formatowania.
Proponuję dwa rozwiązania tego problemu.
Pierwsze polega na poszerzeniu komórki wynikowej do akceptowalnej przez nas szerokości co i tak nie gwarantuje, że nie pojawi się dłuższy tekst. Następnie należy włączyć w tej komórce opcję formatowania o nazwie „Zmniejsz, aby dopasować do rozmiaru komórki” znajdującą się w zakładce „Wyrównanie”, w sekcji „Właściwości” okna dialogowego „Formatuj komórkę”. Tym sposobem wyniki przekraczające przewidzianą przez nas długość, zostaną wpisane tak pomniejszoną czcionką aby zmieściły się w komórce. Oczywiście istnieje tu ryzyko, że pojawi się wynik, który po zmniejszeniu czcionek stanie się mało czytelny.
Drugie rozwiązanie polega na wykorzystaniu funkcji TEKST(). Pierwszym argumentem tej funkcji jest liczba a drugim format, jaki ma zostać wykorzystany do przekształcenia wartości na tekst. Wynikiem tej funkcji jest tekst, więc w takiej komórce można ustawić opcję „Zawijaj tekst automatycznie”. Ta opcja znajduje się w tym samej sekcji co opcja wspomniana powyżej.
Działania obu sposobów przedstawia poniższa ilustracja. Pokazuje ona prezentację słowną liczby 2312. Na ilustracji pokazuję także sposób zapisania funkcji TEKST() dla tego przykładu.
Wykorzystanie w programie Writer.
W tej części chcę pokazać możliwość wykorzystania tego formatowania w dokumencie tekstowym.
Najbardziej typowym przykładem zastosowania tej możliwości będą umowy lub kontrakty, w których oprócz wartości wyrażonych cyframi podaje się także słowną postać liczby, a ponieważ tego typu dokumenty powstają często w różnych wariantach, podczas ciągnących się negocjacji, to w każdym z nich należy ponownie zapisywać słowami wszystkie wymagane liczby.
W przypadku umów o zatrudnienie lub o prace zlecone, które zazwyczaj mają ustalony wygląd, wprowadzanie nowych kwot wymaga ponownego wpisywania ich słownie.
Muszę tu nadmienić, że do liczby wplecionej w treść dokumentu nie można zastosować formatowania liczbowego. W dokumencie tekstowym formatowanie może zostać zastosowane w dwóch przypadkach: do liczb znajdujących się w tabelach oraz do liczb, które są wartościami pól typu „Zmienne”, umieszczonych w dokumencie. Pola te opisałem w opracowaniu „Obliczenia w edytorze Writer” (do przeczytania tutaj: https://yestok.pl/lbo/y10.php).
Poniższa prezentacja pokazuje sposób z wykorzystaniem pola „Zmienne”.
Czasami dokument może zawierać zestawienie tabelaryczne zawierające wyliczenia kosztów poszczególnych etapów prac i dopiero suma tych kosztów stanowi ostateczną kwotę, która powinna zostać przedstawiona słownie.
Komórkom tabel we Writerze można przypisywać format, więc można zastosować omawiany format z modyfikatorem [NatNum12]. Nie można jednak takiego wyniku umieścić w treści dokumentu poza tabelą. Writer pozwala na tworzenie w tabelach takich formuł, które odwołują się do komórek różnych tabel znajdujących się w dokumencie. Jednym z rozwiązań jest zatem utworzenie jednokomórkowej tabeli, znajdującej się w innym miejscu dokumentu, zawierającej formułę końcowego obliczenia odpowiednio sformatowanego.
Takie rozwiązanie proponują twórcy LibreOffice, pisałem o tym w opracowaniu wspomnianym powyżej, sygnalizując dość złożony do zrealizowania proces edycyjny. Rozwiązanie takie jest kłopotliwe w aspekcie edycji dokumentu, lecz czynnikiem decydującym jest nieprzewidywalna długość tekstu. Ani ramka, ani komórka tabeli nie dopasowują się automatycznie do jego długości.
Rozwiązaniem, jakie zaproponowałem, jest utworzenie zakładki przypisanej do wyniku i wstawienie odwołania do niej w tekście dokumentu. Ten wariant przedstawiam w poniższej prezentacji.
Krótkie wyjaśnienie dotyczące tabelki utworzonej w powyższej prezentacji. Wstawienie tabelki do dokumentu możliwe jest na dwa sposoby. Pierwszy, wykorzystujący polecenie „Tabela → Wstaw tabelę...” albo odpowiadający temu poleceniu skrót klawiaturowy CTRL+F12 i drugi, wykorzystujący ikonkę „Wstaw tabelę” w pasku narzędziowym „Standardowy”, jeśli jest odblokowane jej pokazywanie w tym pasku. Pierwszy sposób umieszcza w dokumencie jedynie strukturę tabeli. Więc aby redaktor widział co redaguje, struktura ta jest ukazana szarymi, delikatnymi liniami. Tak właśnie została utworzona tabelka w prezentacji i aby na wydrukowanym dokumencie pojawiły się rzeczywiste krawędzie tabelki należy je określić w jej właściwościach. Drugi sposób wstawia tabelkę z już określonymi krawędziami.
Uzupełnienie.[23.03.2024]
Rozwiązałem problem niewłaściwej formy liczebników porządkowych. Przede wszystkim tych związanych z sytuacją „druge”, „trzece” i „trzeca”. Poprawiłem algorytm generowania wyniku słownego, jednak nie analizowałem całego kodu i moje modyfikacje dotyczą poprawnej formy tych trzech wspomnianych przypadków. Poniżej zamieściłem link do pliku, który należy pobrać i podmienić go w folderze aplikacji LibreOffice.
[17.04.2024] Tymczasowo muszę wyłączyć możliwość pobrania pliku. Wprowadzając poprawki nie przeanalizowałem pełnego kodu i choć formy „drugie” oraz „trzecia” i „trzecie” są teraz poprawne, to źle wyświetlają się liczebniki złożone. Zatem zaproponowana poprawka nie działa dobrze. Dla tych, którzy pobrali poprawkę i ją wgrali do swojego systemu, usuwając jednocześnie oryginalny plik, załączam jego wersję oryginalną.
[18.04.2024] Znalazłem rozwiązanie i załączam – mam nadzieję, że już bez błędów – poprawiony plik.
Plik nosi nazwę „pl_modyfikowany.sor”. Po pobraniu trzeba zmienić jego nazwę na „pl.sor” i przekopiować do folderu „numbertext”, zastępując istniejący w nim plik. Folder ten znajduje się w ścieżce zainstalowanego oprogramowania LibreOffice. W systemie operacyjnym Windows będzie to ścieżka „C:\Program Files\LibreOffice\share\numbertext”. Użytkownicy systemu Windows w wydaniu 64-bitowym, którzy zainstalowali 32-bitową wersję oprogramowania będą mieli go w folderze nadrzędnym „Program Files (x86)”. Aby wykonać tę operację trzeba mieć uprawnienia administratora systemu. W systemach Linux oraz MacOS powinno być podobnie.
Oto poprawiony plik do pobrania: pl_modyfikowany.sor