Liczba słowami III.

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.

Okno dialogowe formatowania liczb z nowym formatem.
Rys. 1: Okno dialogowe formatowania liczb.

W zakreślonym prostokącie znajdują się nowe formaty liczbowe.

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.

Przykład prezentacji liczb znakami rodzimymi języka.
Rys. 2: Prezentacja liczb w znakach narodowych.

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:

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. 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:

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ść:

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.

Prezentowanie liczb wyświetlanych w postaci słownej.
Rys. 3: Przykłady prezentowania wyników formatem "słownie".

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.