Skocz do zawartości
  • 0

zmienna czasu


Spike2701

Pytanie

Wie ktoś w jaki sposób mogę "zmienić formatowanie" zmiennej czasu? Chodzi o to że mam takie coś i chciałbym żeby zamiast np. "2 hours and 11.32 minutes" było "2h, 11m".
 

set {test1} to difference between now and {test2} + 6 hours



zamieniłem tę zmienną w zmienną tekstową i częściowo pomogło bo mogłem zamienić " hours" z "h", ale dalej nie wiem jak zrobić żeby zamiast "2h, 11.32m" było "2h, 11m"

 

set {test1} to difference between now and {test2} + 6 hours
        replace all " hours" with "h" in {test1}
        replace all " minutes" with "m" in {test1}
        replace all " and " with ", " in {test1}

 

Odnośnik do komentarza
https://skript.pl/temat/57475-zmienna-czasu/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
17 minut temu, Spike2701 napisał:

Wie ktoś w jaki sposób mogę "zmienić formatowanie" zmiennej czasu? Chodzi o to że mam takie coś i chciałbym żeby zamiast np. "2 hours and 11.32 minutes" było "2h, 11m".

Z tego co widzę, nie musi Pan w tym kodzie używać zmiennych globalnych, gdyż są one niepotrzebnie zapisywane w pliku variables.csv (przy założeniu, że nie ustawił sobie Pan jakiejkolwiek bazy danych).
Zamiast tego może Pan używać zmiennych lokalnych, które są automatycznie czyszczone po wykonaniu całego kodu, w którym są obecne.

Zmienne lokalne tworzymy poprzez dodanie podłogi (ang. underscore) '_' na początku nazwy zmiennej. Przykład: `set {_test} to "Test"`.

Oczywiście, jeśli Pan gdzieś indziej wykorzystuje te zmienne, nie ma problemu.

20 minut temu, Spike2701 napisał:
set {test1} to difference between now and {test2} + 6 hours
        replace all " hours" with "h" in {test1}
        replace all " minutes" with "m" in {test1}
        replace all " and " with ", " in {test1}

Nie może Pan tak robić, ponieważ efekt 'replace' może być używany tylko na zmiennej zawierającej tekst. Musi Pan więc zamienić wartość zmiennej {test1} na wartość typu tekst, co można najprościej uzyskać za pomocą poniższej linijki.

set {_textTest} to "%{test1}%"
replace ...

Jeśli natomiast chce Pan zaokrąglić ilość minut dla danego okresu czasu, musi Pan użyć wyrażenia 'split' w celu podzielenia tekstu na spacji " ", a następnie zapisać jego wynik do jakiejś listy zmiennych lokalnych.
Dalej, należałoby na podstawie wielkości listy (wyrażenie 'amount') określić ile mamy jednostek czasu (tylko sekundy, sekundy i minuty, godziny, a może i nawet dni), a następnie na podstawie tego wziąć odpowiedni element z tej listy, parse'ować go jako liczbę, zaokrąglić i zapisać ponownie do tekstu. Jak widać, roboty jest trochę.

Istnieje również druga opcja - myślę, że prostsza.

Jak wcześniej, dzielimy tekst z czasem na spacji i zapisujemy do listy zmiennych lokalnych. Następnie zapętlamy tę listę i próbujemy każdy element parse'ować jako liczbę i zapisać do jakiejś zmiennej. Jeśli ta zmienna będzie pusta, oznacza to, że zapętlany element nie był liczbą, a jakimś napisem (na przykład "hours", a nie "2"). Tutaj z pewnością przyda się ten warunek.
Jeśli zmienna posiada jakąś wartość (a więc warunek 'is set' zwrócił 'true'), można ją dodać jako kolejnej listy i próbować to formatować.

W skrócie - w Skript nie istnieje łatwa i przyjemna w użyciu instrukcja pozwalająca na formatowanie typu 'timespan'. A szkoda.

Odnośnik do komentarza
https://skript.pl/temat/57475-zmienna-czasu/#findComment-342213
Udostępnij na innych stronach

  • 0
12 minut temu, Kormic napisał:

Z tego co widzę, nie musi Pan w tym kodzie używać zmiennych globalnych, gdyż są one niepotrzebnie zapisywane w pliku variables.csv (przy założeniu, że nie ustawił sobie Pan jakiejkolwiek bazy danych).
Zamiast tego może Pan używać zmiennych lokalnych, które są automatycznie czyszczone po wykonaniu całego kodu, w którym są obecne.

Zmienne lokalne tworzymy poprzez dodanie podłogi (ang. underscore) '_' na początku nazwy zmiennej. Przykład: `set {_test} to "Test"`.

Oczywiście, jeśli Pan gdzieś indziej wykorzystuje te zmienne, nie ma problemu.

Nie może Pan tak robić, ponieważ efekt 'replace' może być używany tylko na zmiennej zawierającej tekst. Musi Pan więc zamienić wartość zmiennej {test1} na wartość typu tekst, co można najprościej uzyskać za pomocą poniższej linijki.

set {_textTest} to "%{test1}%"
replace ...

Jeśli natomiast chce Pan zaokrąglić ilość minut dla danego okresu czasu, musi Pan użyć wyrażenia 'split' w celu podzielenia tekstu na spacji " ", a następnie zapisać jego wynik do jakiejś listy zmiennych lokalnych.
Dalej, należałoby na podstawie wielkości listy (wyrażenie 'amount') określić ile mamy jednostek czasu (tylko sekundy, sekundy i minuty, godziny, a może i nawet dni), a następnie na podstawie tego wziąć odpowiedni element z tej listy, parse'ować go jako liczbę, zaokrąglić i zapisać ponownie do tekstu. Jak widać, roboty jest trochę.

Istnieje również druga opcja - myślę, że prostsza.

Jak wcześniej, dzielimy tekst z czasem na spacji i zapisujemy do listy zmiennych lokalnych. Następnie zapętlamy tę listę i próbujemy każdy element parse'ować jako liczbę i zapisać do jakiejś zmiennej. Jeśli ta zmienna będzie pusta, oznacza to, że zapętlany element nie był liczbą, a jakimś napisem (na przykład "hours", a nie "2"). Tutaj z pewnością przyda się ten warunek.
Jeśli zmienna posiada jakąś wartość (a więc warunek 'is set' zwrócił 'true'), można ją dodać jako kolejnej listy i próbować to formatować.

W skrócie - w Skript nie istnieje łatwa i przyjemna w użyciu instrukcja pozwalająca na formatowanie typu 'timespan'. A szkoda.

Jak mogę to zrobić to co napisałeś? Możesz napisać przykładowy fragment kodu?

Odnośnik do komentarza
https://skript.pl/temat/57475-zmienna-czasu/#findComment-342214
Udostępnij na innych stronach

  • 0
51 minut temu, Spike2701 napisał:

Jak mogę to zrobić to co napisałeś? Możesz napisać przykładowy fragment kodu?

Niestety trudno tutaj o przykładowy kod. Mogę jedynie pokazać jak ja bym napisał taką funkcję.
Wiem, że z dawania gotowego kodu pożytku praktycznie brak, ale mam nadzieję, że Pan sobie przeanalizuje ten skrypt i zrozumie jego działanie. Może Pan sobie używać w środku funkcji instrukcję 'broadcast', aby wyświetlić wartość danej zmiennej i widzieć "na bieżąco" co się dzieje.

Proszę uprzejmie. W razie wątpliwości proszę pytać, chętnie odpowiem. Dodatkowo odsyłam do dokumentacji, którą się już kilkukrotnie posiłkowałem w moim poprzednim poście.

function formatTimespan(t: timespan) :: text:
	set {_tText} to "%{_t}%"
	replace all "and " with "" in {_tText}
	replace all ", " with " " in {_tText}
	replace all "hours" with "h" in {_tText}
	replace all "minutes" with "m" in {_tText}
	replace all "seconds" with "s" in {_tText}
	set {_split::*} to {_tText} split at " "
	loop (size of {_split::*}) times:
		if mod(loop-number, 2) is 1:
			add "%round({_split::%loop-number%} parsed as number)%" to {_timeNumbers::*}
			continue
		add {_split::%loop-number%} to {_timeUnits::*}
	set {_returnTimespan} to ""
	loop {_timeNumbers::*}:
		if (loop-index parsed as number) is 1:
			set {_returnTimespan} to "%loop-value%%{_timeUnits::%loop-index%}%"
			continue
		set {_returnTimespan} to "%{_returnTimespan}%, %loop-value%%{_timeUnits::%loop-index%}%"
	return {_returnTimespan}

command /testformat:
	trigger:
		set {_time} to "6 hours and 11.17 minutes" parsed as timespan
		send formatTimespan({_time}) to sender

 

Odnośnik do komentarza
https://skript.pl/temat/57475-zmienna-czasu/#findComment-342215
Udostępnij na innych stronach

  • 0
1 minutę temu, Spike2701 napisał:

Trochę skomplikowany skrypt. Dzięki za pomoc, a krócej się nie da?

Niech mi Pan uwierzy, że chciałbym. Problem w tym, że trzeba wykonać kilka kroków i jest to nieuniknione.

  1. Najpierw należy zamienić okres czasu na tekst, pousuwać przecinki, spójniki "and" i podstawić pod jednostki czasu ich skrótowe wersje.
  2. Następnie trzeba podzielić ten tekst na fragmenty dzieląc go na każdej spacji i zapisać do listy zmiennych.
  3. Parzyste elementy (czyli reszta z dzielenia równa 0) to jednostki czasu, a nieparzyste elementy (reszta z dzielenia równa 1) to ich wartości. Dzielimy je według tego kryterium na dwie listy i dodatkowo zaokrąglamy wartości do najbliższych liczb całkowitych.
  4. W ramach ostatniego kroku musimy połączyć te dwie listy ponownie w jeden napis.

Gdyby wykonać go dla przypadku szczególnego (na przykład zakładamy, że będą tylko godziny i minuty), być może skrypt byłby nieco krótszy. Niemniej jednak uważam, iż zawsze warto szukać rozwiązania dla przypadku ogólnego, bo mamy pewność, że ono zawsze zadziała.

Odnośnik do komentarza
https://skript.pl/temat/57475-zmienna-czasu/#findComment-342217
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Odpowiedz na pytanie...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...