Programovanie makier v LibreOffice: Formátovanie čísel (2) – CSng, CDbl, CBool

Vývoj Pokračujeme v hľadaní správneho formátu argumentov pre funkciu CSng, CDbl a CBool.   

Formát čísel pre funkciu CSng

Funkcia CSng vrácia racionálne čísla s menšou dĺžkou a presnosťou. Premenná typu Single ma rozsah od +/- 1,4E-45 až +/-3,4E38. Aké argumenty použiť si ukážeme v prvom príklade.

1. príklad: Testujeme formát argumentov pre funkciu CSng

Sub macro

On Error Resume Next

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

pole() = Array(22, -98, -8.1, -289.789884005, 15682.45958, 178,1E9, 215.4E-10, 235.14E-33, "p8.31", "154.8889", "-787.22", "898.77", "569.78998pol", "-89898.7895sg", 454.87E32, "15.22", 15.22)

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

MsgBox retazec

End Sub

Výsledok makra Výsledok makra

Rozbor makra:

Najviac prekvapujúce zistenie je, že funkcia CSng nedokáže vytiahnuť racionálne číslo z reťazca, ak je desatinná časť oddelená bodkou. Veľmi dobre vysvetlenie k tomuto nájdete v komentári pod článkom od používateľa lp.

Formát čísel pre funkciu CDbl

Funkcia CDbl vracia typ premennej Double. Narozdiel od Single má Double väčší rozsah a to od +/-4.9E-324 až 1.8E308, čo nám ponúkne omnoho väčšie škálovanie s plávajúcou desatinnou čiarkou oproti premennej Single.

2. príklad: Formát čísel pre funkciu CDbl

Sub macro

On Error Resume Next

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

pole() = Array(22, -98, -8.1, -289.789884005, 15682.45958, 178,1E9, 215.4E-10, 235.14E-33, "p8.31", "154.8889", "-787.22", "898.77", "569.78998pol", "-89898.7895sg", 454.87E32, "15.22", 15.22, 1545.45E125, -4546.48E-128, 45.45E200, -4.45E-242, 12.4E301, 14.7E-302)

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

MsgBox retazec

End Sub

Výsledok makra Výsledok makra

Rozbor makra:

Funkcia CDbl funguje rovnako ako funkcia CSng, len s tým rozdielom, že vracia premennú typu Double.

Formát výrazov pre funkciu CBool

Funkcia CBool po vyhodnotení výrazu vracia pravdivostnú hodnotu. Otázkou je, čo všetko vie vyhodnotiť táto funkcia? To si ukážeme v treťom príklade.

3. príklad: Formát výrazov pre funkciu CBool

Sub macro

On Error Resume Next

Dim i As Integer
Dim retazec As String
Dim pole()
Dim a, b, c, d, e, f As Integer

a = 12 : b = 10 : c = 14 : d = 11 : e = 14 : f = 15  
pole() = Array(0 ,-1, 15, 12.7, "0", "189", "k785", "8785loiuu", "4451.4558uxfi", -1818, -145.155, "-klp7178", "-785hm", "-7595.78889", "-155.144pklp", 20 < 15, 10 < 12, 48 > 12, 15 = 14, 28 = 28, 25 <> 14, 881 <> 881, "25 < 24", "999 <> 888", a = b, c < e , d > f, f <> a, c = e, a <= d, f >= a, &HA <> &HA2)

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

Msgbox retazec

End Sub

Výsledok makra Výsledok makra

Rozbor makra:

1 CBool(0) = False – číslo 0 je návratová hodnota pre False

2 CBool(-1) = True – číslo -1 je návratová hodnota pre True

4 CBool(12,7) = True – okrem čísla 0 vráti True vždy bez ohľadu nato, či je číslo celé alebo racionálne

5 CBool(0) = False – funkcia vie vydolovať číslo aj z reťazca

6 CBool(189) = True – vracia to čo má

7 CBool(k785) = – síce funkcia vie zobrať číslo z reťazca, ale ak je zapísané numerický

15 CBool(-155.144pklp) = – podobne ako bod 7 a rovnaký dôvod platí pre všetky zápisy, ktoré nedali žiadny výsledok

16 CBool(0) = False – klasické porovnávanie čísel

23 CBool(25 < 24) = – je síce pravda, že funkcia vie získať číslo z reťazca, ale nenumerické znaky už nie

25 CBool(False) = False – porovnávanie prostredníctvom zadeklárovaných premenných

32 CBool(-1) = True – posledný príklad slúži ako ukážka, že u hexadecimálnych čísel platia rovnaké pravidla ako u desiatkových

(Jako ve škole) Průměr: 2.00 | Hodnotilo: 3
 

Komentáře

user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Formátovanie čísel (2) – CSng, CDbl, CBool
24. 11. 2017, 08:50:24
Add "překvapení", že CSng, CDbl "neumí" číslo z řetězce.

Tyto (C-)funkce pracují nastaveným prostředím (oddělovače, datumy).

podle:
https://help.libreoffice.org/3.5/Basic/CSng_Function_Runtime/cs

"Parametry:

Výraz: Řetězec nebo číselný výraz, který chcete převést. Pro převod řetězce musíte číslo zadat jako normální text ("123.5") ve formátu, jaký používá váš operační systém."

Tj. CSng("1212,455") funguje podle očekávání.

Z tohoto d;vodu je poněkud nestandardní chování CBool (která má mimochodem i další syntaxi)

Podle nápovědy v tomto případě je syntaxe CBool(číslo).
To, jak má zacházet s řetězci nápověda neuvádí, očekával bych chybu). CBool se ovšem nejprve pokouší převést text na číslo. Bohužel hledá číslo v angličtině:

CBool("0.000") = false
CBool("1.000") = true
CBool("0,000") = chyba

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