Freitag, 19. April 2024, 01:33 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: INVESTOX-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

MacDschie

unregistriert

1

Donnerstag, 10. März 2011, 01:26

Probleme mit ScriptBerechneFormel und nicht-ganzzahligen Paramtern vom Typ Wert

Hallo,

ich versuche gerade, in einem VBS-Script die Funktion ScriptBerechneFormel einzusetzen und der verwendeten Formel einen Wert zu übergeben, der dem Script übergeben wurde. Ein Problem ergibt sich dabei, wenn der Wert keine Ganzzahl sondern eine Fließkommazahl ist. Ich baue hier die Formel zuerst als String, wobei der Parameter mit der cStr()-Funktion eingefügt wird:

Quellcode

1
Formel = "Indikator(" & cStr(Parameter) & ")"


Entgegen der VBS-Hilfe enthält die Variable Formel danach aber nicht den Text "Indikator(7.5)", sondern "Indikator(7,5)", wenn Parameter den Wert 7,5 hat. Das Komma scheint ScriptBerechneFormel durcheinander zu bringen. Übergebe ich meinem Skript einen ganzzahligen Wert (z. B. 7), funktioniert alles wie gewünscht. Gibt es hier noch eine andere Funktion oder Möglichkeit, die das gewünschte Ergebnis liefert?

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

2

Donnerstag, 10. März 2011, 11:37

cint()
If you think it´s expensive to hire a professional, wait until you hire an amateur.

MacDschie

unregistriert

3

Donnerstag, 10. März 2011, 15:33

Danke für den Tip. Leider rundet cint() die Nachkommastellen, sie sollen aber übergeben werden.

Immerhin hat die VB-Hilfe von cint() auf eine Funktion verwiesen, mit der ich weiter gekommen bin. Das Ergebnis ist eine selbst geschriebene Funktion

Quellcode

1
2
3
4
5
6
function FloatToStr(p_Float)
  FloatToStr = Fix(p_Float)
  if Fix(p_Float) <> p_Float then
	FloatToStr = FloatToStr & "." & (p_Float - Fix(p_Float)) * 10000
  end if
end function


die eine Zahl "zu Fuß" in einen String mit Punkt anstatt Komma konvertiert. Ist zwar noch verbesserungsbedürftig, was die Anzahl der Dezimalstellen angeht, aber es tut.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

4

Donnerstag, 10. März 2011, 16:46

Das Ergebnis ist eine selbst geschriebene Funktion .. die eine Zahl "zu Fuß" in einen String mit Punkt anstatt Komma konvertiert.

Was ein Aufwand, wieviele Zeilen. Replace() würde mit einer einzigen Zzeile auch eins bis n Zeichen gegen eins bis m Zeichen austauschen. z.B. Komma gegen Punkt.

Warum schreibst Du überhaupt CStr() hin, Investox übergibt den Parameter an Dein Script, Du gibst ihn an scriptberechneformel() weiter; klappt es nicht einfach ohne CStr() und selbstgeschriebenen Funktions-Voodoo?

CStr() geht ausserdem über die Lokales, die Du in Windows landesspezifisch eingestellt hast. Dementsprechend erkennt es mehr oder weniger klever eine Zahl, ein Datum oder sonstwas und wandelt, oder es erkennt nicht und bastelt nen String. Wie scheint's in Deinem Fall.
Gruss
Bernd

MacDschie

unregistriert

5

Donnerstag, 10. März 2011, 18:07

Hi Bernd,

danke für den Tipp mit Replace(), die Funktion kannte ich bisher nicht. Damit wird's etwas eleganter.

Ohne "Voodoo" klappt's nicht, weil VB die Variable halt mit Dezimal-Komma und nicht mit Punkt in den Formel-String einfügt. Und wenn da ein Komma drin ist, haut mir ScriptBerechneFormel() den Formel-String mit ner Fehlermeldung um die Ohren, dass die Anzahl der Parameter nicht passt. Komma trennt halt diese Parameter...

Und in die Funktion habe ich den Krams gepackt, weil ich's öfters brauche, und als Programmierer gewohnt bin, aus Code, der öfters vorkommt, separate Funktionen zu machen. Hilft der Übersicht... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MacDschie« (10. März 2011, 18:36)


Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

6

Freitag, 11. März 2011, 01:07

Du könntest mal noch probieren, ob es geht, wenn Du für das Casting nicht CStr raten lässt, sondern erst eine korrekte Zahl aus dem Text machst, mit cDbl oder CSng (je nachdem was für die Darstellung Deines Parameters im Zahlenformat erforderlich ist). z.B.:

Formel = "Indikator(" & cStr(cDbl(Parameter)) & ")"

Gegenüber hart codierten String-Geschichten mit "." und "," hätte das dann den Vorteil, dass Dein Indi auch mit anderen Locales ablauffähig wäre, als jenen, die Du auf Deinem PC zufällig eingestellt hast (german, nehme ich an). Spielt aber natürlich nur eine Rolle, wenn Du mal mit Kollegen zusammenarbeiten willst, die vielleicht englische, französische, schweizerische usw. Settings auf ihrem PC haben ;)
Gruss
Bernd

MacDschie

unregistriert

7

Sonntag, 13. März 2011, 23:00

Hab das mal getestet: egal, mit welcher Funktion ich konvertiere, im finalen String steht immer ein Komma (bzw. das Zeichen, das in den Locale-Settings von Windows eingestellt wurde - das kann auch was ganz anderes sein als Punkt oder Komma, aber dann wird mein Script erst gar nicht aufgerufen, weil der Parameter-Variablen der Wert erst gar nicht zugewiesen werden kann). Da die Investox-Syntax zwingend einen Punkt verlangt, will ich also von den Locales unabhängig werden und das Dezimalsymbol fix durch einen Punkt ersetzen.

Investox

Administrator

Registrierungsdatum: 31. August 2002

Beiträge: 5 680

8

Montag, 14. März 2011, 09:52

Hallo,

eine Möglichkeit zur Dezimal-Umwandlung wäre wie folgt:

a=1.234
msgbox join(split(a,","),".")


Viele Grüße
Andreas Knöpfel