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

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
 
 
woo jaw demo hz