Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val

LibreOffice V tomto článku sa pozrieme na využitie argumentov pre funkcie CByte, CStr a Val.   

Formát pre funkciu CByte

Funkcia CByte premieňa číslo alebo reťazec na postupnosť bytov. Ale pozor! Musí to byť celé číslo (poprípade racionálne ale pozor na zaokrúhľovanie) v intervale od 0 do 255. Ktoré argumenty sú prípustné a ktoré nie sa dozviete z prvého príkladu.

1. príklad: Testujeme argumenty pre funkciu CByte

Sub macro

On Error Resume Next

Dim i As Integer
Dim retazec As String
Dim pole()

pole() = Array(0, 100, 255, 266, 1000, -10, -255, 10.6, 254.6, "11", "45", "88", "-25", "-89", "84p", "o78", "87.2", "144.78", "78,12", "254,99", "p125,77", "127,45osel", &HA2, &HB7, &HC8)

For i = LBound(pole()) To UBound(pole())
        retazec = retazec & i+1 & " CByte(" & pole(i) & ") = "
        retazec = retazec & CByte(pole(i)
        retazec = retazec & Chr(10)
Next 

MsgBox retazec

End Sub

Výsledok činností makra Výsledok činností makra

Rozbor makra:

4 CByte(256) = – mimo rozsah intervalu 0-255

6 CByte(-10) = – žiadne záporne číslo funkcia nepodporuje

8 CByte(10,6) = 11 – funkcia racionálne čísla zaokrúhľuje

11 CByte(45) = 45 – vie číslo vytiahnuť i z reťazca

22 CByte(127,45osel) = 127 – vie získať číslo aj v takomto reťazci

23 CByte(162) = 162 – rovnako ani hexadecimálne čísla nie sú problém

Formát pre funkciu CStr

Funkcia CStr prevedie argument na reťazec. Dokáže funkcia previesť väčšinu argumentov? To si ukážeme v druhom príklade.

2. príklad: Testujeme funkciu CStr

Sub macro

On Error Resume Next

Dim i As Integer
Dim retazec As String
Dim pole()

pole() = Array(r, popo, pr4, mongii, 45, 45454, 444815, -1045, -455255, 104.4556, 25445.64, "455411", "4555455", "88878788", "-525", "-89", "84p", "o78", "87.2", "144.78", "78,12", "254,99", "p125,77", "127,45osel", &HA2, &HB7, &HC8)

For i = LBound(pole()) To UBound(pole())
        retazec = retazec & i+1 & " CStr(" & pole(i) & ") = "
        retazec = retazec & CStr(pole(i))
        retazec = retazec & Chr(10)
Next 

MsgBox retazec

End Sub

Výsledná činnosť makra Výsledná činnosť makra

Rozbor programu:

Vidíte, že funkcia CStr si poradí takmer so všetkým. Jedine s čím si neporadí, je napísanie znaku alebo slova tak ako píšeme numerické čísla.

Formát pre funkciu Val

Funkcia Val prevedie reťazec, ktorý predstavuje nejaké racionálne alebo celé číslo do numerickej podoby. Funkcia vracia typ Double.

3. príklad: Testujeme funkciu Val

Sub macro

On Error Resume Next

Dim i As Integer
Dim retazec As String
Dim pole()

pole() = Array(r, popo, pr4, mongii, 45, 45454, 444815, -1045, -455255, 104.56, 2545.64, "455411", "4555455", "88878788", "-525", "-89", "84p", "o78", "87.2", "144.78", "151.44", "-167.444", "78,12", "254,99", "454,77", "-4578,77", "-8954,448", "p125,77", "127,45osel", &HA2, &HB7, &HC8)

For i = LBound(pole()) To UBound(pole())
        retazec = retazec & i+1 & " Val(" & pole(i) & ") = "
        retazec = retazec & Val(pole(i))
        retazec = retazec & Chr(10)
Next 

MsgBox retazec

End Sub

Výsledná činnosť makra Výsledná činnosť makra

Rozbor makra:

Táto funkcia má viacero zaujímavostí. Ukážeme si ich v jednotlivých bodoch.

1 Val() = 0 – znak r nie je číslo, vráti nulu

10 Val(104,56) = 10456 – pri takomto zápise vráti číslo ale bez desatinnej čiarky

17 Val(84p) = 84 – rovnako vie funkcia vytiahnuť čísla ak sú pred prvým výskytom znaku

18 Val(o78) = 0 – argument nezačína číslom a preto vracia 0

19 Val(87.2) = 87,2 – ak je desatinná čiarka reprezentovaná bodkou, vie to funkcia spracovať

23 Val(78,12) = 7812 – a dostávame sa k zaujímavej situácii, klasické čiarky evidentne funkcia nepodporuje. Otázka je, prečo tomu tak je? Je to možné kvôli nastaveniu môjho lokálneho počítača alebo je príčina iná? Ak viete povedať k tomu viac, tak sa podeľte o komentár pod článkom.

30 Val(162) = 162 – hexadecimálne čísla tiež nie sú problém



(Jako ve škole) Průměr: 1.50 | Hodnotilo: 4
 

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
7. 12. 2017, 08:37:45
Tečka je daná syntaxí příslušné úrovně programovacího jazyka. Známe to například z XML kde toto pravidlo (tečka místo desetinné čárky) platí i v "počeštěných" programových modulech.

Například čárka odděluje parametry a tečka je běžný "americký" zápis oddělovače desetinných míst pro vrchní (na terminálu viditelnou) vrstvu. Tenhle problém známe prakticky z mnoha programovacích jazyků. Myslím že všude kde se vyskytuje čárka jako separátor u array. Ta totiž nemůže současně oddělovat parametry a současně označovat desetinnou část čísla.

Tečka nám dělá problémy například při převodech z CSV, které je převodem z XML ale i pro datumy - při nastavení anglického prostředí. V takových případech dost dobře nejde předvídat obecnou potřebu substituce tečky za čárku. Ta se pak musí dodělat manuálně, scriptem či specializovaným makrem.

Při programování si musíme být jisti pro jakou vrstvu potřebujeme znát sytaktická pravidla. V LO (AOO) programujeme sice v Basicu, ale některé věci se předávájí ke zpracování jinému jazyku - nejčastěji přes UNO, ale může to být Shell, JavaScript, nebo Python a podobně.

Nejlépe je to vidět když programujeme v Basicu zdroják XML (html). Musíme zachovat pravidla syntaxe pro daný značkovací jazyk který ve výsledku udělá výstup do češtiny. Pro to i když píšeme v Basicu pravidla XML musíme akceptovat.
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
8. 12. 2017, 23:11:34
"CStr si poradí takmer so všetkým. Jedine s čím si neporadí, je napísanie znaku alebo slova tak ako píšeme numerické čísla."

Ona si s tím poradí. Text bez uvozovek je neinicializovaná proměnná. Proto to prázdno.



Option Explicit ' Pomůže odhalit chyby

Sub macro

' On Error Resume Next ' jinak se chyba běhu neuplatní

Dim i As Integer
Dim retazec As String
Dim pole()

pole() = Array(r, popo, pr4, mongii, 45, 45454, 444815)

For i = LBound(pole()) To UBound(pole())
retazec = retazec & i+1 & " CStr(" & pole(i) & ") = "
retazec = retazec & CStr(pole(i))
retazec = retazec & Chr(10)
Next

MsgBox retazec

End Sub

Val:

Val slouží k převodu formátovaného čísla (v textu) v anglickém formátu. Její lokalizovaná obdoba je CDbl. Implementace ovšem není důledná a chování u jiných typů parametrů než je text je občas záhadné.

Čárka - v angličtině je čárka oddělovač tisíců. Funkce vrací číslo, čárka se tedy vynechává. Implementace je celkem jednoduchá, zřejmě pro to byl důvod. Funkce vynechá libovolný počet čárek a mezer na libovolné pozici před desetinnou tečkou. Za desetinou tečkou je čárka chápaná jako text a převod se u ní zastaví.
user avatar neutr
Odpovědět
Re:Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
9. 12. 2017, 08:25:30
Čárka jako oddělovač tisíců není pro výpočet respektive zpracování čísel podstatná. Je to jen optické opatření pro lidské vnímání. Stroj nic takového nepotřebuje. Proto čárka do zdrojáku jako oddělovač desetinných míst nepatří.

To co je potřebné je odělování desetinné části čísla a to je tečka podle anglické respektive americké notace která byla zavedena autory. Kdyby to udělali obráceně asi by museli použít jiný odělovač pro array - například středník nebo tu tečku.

Ve formátech výstupů se už čárka jako odělovač tisíců, nebo i jako oddělovač desetinných míst objevit může a při lokalizacích výstupů musí. To je stejný problém jako s formátem datumu. Přes to někdy špatný formát datumu, nebo i čísla probublá až do monitoru. Když se podíváte zde do pravého panelu - na příspěvky takovéto diskuse tak mají také "nečeský" formát RRRRMMDD i když v tomto "domovském sloupci" je to správně.
user avatar Eduard Boldižár
Odpovědět
Re:Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
9. 12. 2017, 14:21:17
Pre lp: máte pravdu, avšak ja to myslím tak, že funkcia Val si s tým neporadí, čiže nedostaneme optimálny výsledok ako u zvyšku argumentov. I keď je pravda, že som to mál dávno spomenúť, že argument iných znakov ako číselných bez string úvodzoviek nedostaneme to čo by sme chceli.
user avatar Eduard Boldižár
Odpovědět
Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
9. 12. 2017, 14:23:54
CStr som myslel, nie Val, ospraavddlňujem sa
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Formátovanie čísel (3) – CByte, CStr a Val
9. 12. 2017, 15:20:07
Pokud je argumentem text bez uvozovek, tak ten text je jmeno proměnné. To "neporadí" tedy znamená, že funkce nevrací jméno proměnné. To od této funkce ani nečekám.

Ve Vašem příkladu je ale ve skutečnosti je argumentem hodnota pole, které je vytvořeno funkcí Array. Tam se ve skutečnosti odehraje část konverzí. Pokud je argumentem pole proměnná, do pole se vloží hodnota proměnné, tj. tady to je prázdná hodnota.

dim promenna
MsgBox CStr(promenna) ' neinicializovaná proměnná, vypíše obsah, tj. nic
MsgBox CStr("promenna")' text, na výstupu jej zopakuje

promenna = "promenna"
MsgBox CStr(promenna) ' inicializovaná proměnná, vypíše obsah

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz