(Wyjaśnione) Prośba o sprawdzenie kodu, bug w AOO?

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
Awatar użytkownika
Rafkus
Posty: 516
Rejestracja: czw kwie 12, 2018 10:26 pm

(Wyjaśnione) Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Rafkus »

Grzebiąc w moim kodzie, przypadkiem odkryłem dziwne wyniki otrzymane z makra w Apache OpenOffice. W skrócie problem wygląda tak:

Kod: Zaznacz cały

sub test1
dim q() as variant
dim el as string
dim ele as variant

q=ARRAY("2A", "1B","2C","8D","3E","4F","4G","5H", "3ERA", "2DA", "D4" )
for each el in q
  print el; IsNumeric(el); typename(el)
  if IsNumeric(el) then   'określenie typu elementu
        ele = CDBL(el)      'element jest liczbą
  else
        ele = trim(el)      'element jest tekstem, pozbycie się początkowych i końcowych spacji
  endif 
  print ele; typename(ele)
next
end sub
Jak widać wszystkie elementy tablicy q są typu tekstowego. Sprawdzając kolejne elementy czy są liczbami i otrzymuję że są nimi: "8D" oraz "3E", które to następnie zostają zmienione na liczbę. W LO tego problemu nie ma...
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2259
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Jermor »

To samo obserwuję w swoim LO.
To, co ustaliłem:
Jeśli "tekstowy" ciąg liczbowy kończy się literą D lub E (małą lub wielką) to będzie traktowany jako numeryczny, ale typ to "String".
  • Obie litery są traktowane jako mnożnik 10^n, przy czym brak liczby oznacza n=0
  • W obu Basicach przecinek jest traktowany jako separator części ułamkowej (prawdopodobnie przejęty z ustawień regionalnych), podczas gdy Basic nie stosuje ustawień regionalnych.
  • Wpisanie kropki jako separatora traktuje cały ciąg jako tekst.
  • Dopisanie spacji na końcu tego ciągu także traktuje go jako nienumeryczny.
Więc to chyba jest bug.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Jan_J »

Sprawdziłem Twój kod w LO 7.3.6.2 x86_64 rpm z documentfoundation.org
Wszystkie wpisy są typu String. Jakboziakazała.
Print w GUI jako wyjście diagonostyczne — koszmarek.
Windowsa nie mam takiego by na nim instalować; Apache też aktualnie nie mam.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 516
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Rafkus »

Dziękuję za sprawdzenie, nie chodziło mi tutaj o sprawdzenie typu zmiennej, tylko o sprawdzenie funkcji IsNumeric. Nie wiadomo czemu ni z gruszki czy pietruszki twierdzi że teksty liczbowe zakończone literką d, D, e, E SĄ LICZBAMI!!!

Kod: Zaznacz cały

 IsNumeric("13A") 

daje w wyniku false, co jest wynikiem oczekiwanym - poprawnym, ale:

Kod: Zaznacz cały

 IsNumeric("13E"), IsNumeric("-99e"), IsNumeric("1245d"), IsNumeric("-1345,13D")

Dają w wyniku true co jest kompletną bzdurą i rozwala mi całą koncepcję stworzonej funkcji. Dodatkowo te teksty bez problemu są konwertowane na liczbę poleceniem CDBL()... :crazy:

Pozostaje mi teraz, oprócz sprawdzenia czy dany tekst jest numeryczny, sprawdzić czy występują w nim dodatkowo litera d lub e :roll:

Jermor, bardzo mnie zdziwiłeś informacją że ten efekt również zauważyłeś w swoim LO, gdyż w moim nieco starszym tego efektu nie ma. Szaleństwo...
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Jan_J »

Sprawdziłem także wyjścia z IsNumeric na danych String. Twoje i inne.
Wszystkie zakończone literkami są False. Z przecinkiem dają True. Z kropką dają False. Notacja naukowa "2e4" daje True.
Precyzja specyfikacji w helpie https://help.libreoffice.org/7.2/en-US/ ... 02700.html — pominę milczeniem. Ale w https://help.libreoffice.org/7.2/en-US/ ... IX#dezimal czytamy
Decimal Point

When converting numbers, LibreOffice Basic uses the locale settings of the system for determining the type of decimal and thousand separator.

The behavior has an effect on both the implicit conversion ( 1 + "2.3" = 3.3 ) as well as the function IsNumeric.
Czyli robi tak jak napisano.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 516
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Rafkus »

Jermor pisze: czw lis 10, 2022 8:44 pm Obie litery są traktowane jako mnożnik 10^n, przy czym brak liczby oznacza n=0
Faktycznie, masz rację i o ile zapis naukowy np: 1E3 jest mi znany to z przypadkiem użycia do tego celu litery "D", spotkałem się po raz pierwszy.

Dziękuje za pomoc.
Przyczyna wyjaśniona ale pozostał mi problem do rozwiązania.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2259
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Jermor »

Jeżeli zadeklarujesz: Dim q() as String, wszystko będzie działało.
Funkcja ARRAY() zwraca wartość typu Variant, a ten przyjmuje konkretny typ zależny od podstawianej wartości, czyli z jakichś powodów traktuje zapisy, nawet zapisane jako literale, z literą D i E na końcu jako liczby, a ponieważ q jest także typu wariant to wszystko pasuje.
P.S. Też nie wiem, dlaczego D ma takie znaczenie.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2259
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: Jermor »

Dopisuję.
Tylko że tobie chodzi o to, by w tablicy były różne wartości.
Z testów wynika, że najlepiej byłoby, gdyby wszystkie twoje zmienne były typu Variant. Wtedy zapisy z literą D i E są traktowane jako teksty. Problemem jest natomiast umieszczenie liczby jako literala. Wtedy zawsze nastąpi konwersja do liczby. W zapisie: ARRAY(1234, "25", "1B","2,52","8D","3E","4.02","4G") jako liczby zostaną zinterpretowane wyróżnione elementy. Jednak dopisanie jakiejś liczby po E lub D potraktuje ten ciąg jako liczbę.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
cwolan
Posty: 54
Rejestracja: pn sty 25, 2021 11:17 pm

Re: Prośba o sprawdzenie kodu, bug w AOO?

Post autor: cwolan »

Rafkus pisze: pt lis 11, 2022 11:29 am
Jermor pisze: czw lis 10, 2022 8:44 pm Obie litery są traktowane jako mnożnik 10^n, przy czym brak liczby oznacza n=0
Faktycznie, masz rację i o ile zapis naukowy np: 1E3 jest mi znany to z przypadkiem użycia do tego celu litery "D", spotkałem się po raz pierwszy.
Jermor pisze: pt lis 11, 2022 12:23 pm Jeżeli zadeklarujesz: Dim q() as String, wszystko będzie działało.
Funkcja ARRAY() zwraca wartość typu Variant, a ten przyjmuje konkretny typ zależny od podstawianej wartości, czyli z jakichś powodów traktuje zapisy, nawet zapisane jako literale, z literą D i E na końcu jako liczby, a ponieważ q jest także typu wariant to wszystko pasuje.
P.S. Też nie wiem, dlaczego D ma takie znaczenie.

W kwestii "D" (oraz "d")...

LibreOffice Help — począwszy od wersji 7.3 informacja o funkcji CInt() jest szersza [1]. Pojawił się m.in. zapis:
  • Decimal numbers (with optional leading sign) using decimal and group separators of locale configured in LibreOffice (group separators are accepted in any position), with optional exponential notation like "-12e+1" (where an optionally signed whole decimal number after e or E or d or D defines power of 10);

Pozwolę sobie zwrócić uwagę na:
  1. wątek "isnumeric function"
  2. What does letter D represent in floating-point data
  3. Fortan 77 - Data Types and Declarations
Jeśli to kogoś interesuje, kod rozpoznający litery "DdEe" znajduje się w pliku źródłowym sbxscan.cxx [2].


Sprawę „chimeryczności” funkcji isNumeric() — ale nie tylko tej funkcji — pozostawiam ekspertom.



--------------------------------------
[1] Zapis nt. funkcji CInt() został rozszerzony w związku z
Bug 145617 - Documentation for CINT%: inappropriate, incomplete and misleading

[2] plik źródłowy sbxscan.cxx, metoda ImpScan() i poprzedzający ją komentarz
LibreOffice
Apache OpenOffice
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 7.6.6
Windows 7,10,11 64-bit
ODPOWIEDZ