Zahlwert aus String auslesen

  • hallo, ich haette da mal eine Frage: :hm:

    Strings vergleicht man ja durch:
    IF StringInStr(VariableInDerDerStringEnthaltenIst, "Suchstring") = 1 Then...

    mein Problem ist jetzt, daß ich nur den Zahlwert suche.

    Bsp: $Variable = "Sie haben $0.37 gewonnen"
    Die gesuchte Function soll mir nur den Zahlwert ausgeben (0.37).
    Die Länge des Strings und die Zahlen sind dynamisch.


    Wie geht das?
    Danke @Berti

  • hallo th.meger, :irre:
    ... soll mir nur den Zahlwert ausgeben 0.37 .

    Format der Zahl: 0.01 bis 9999.99
    Textlänge unterschiedlich (dynamisch)


    Gruss @Berti

    P.S. Hab in der Hilfe leider kein RegExp gefunden, bin schon gespannt.

  • danke an th.meger, :stolz_bin:
    sieht gut aus. Werde es gleich mal ausprobieren.

    Gruss @Berti

    ----------------------------------------------------------------------
    hat irgendwie nicht gefunzt.
    Kannst Du mir mal die Syntax von StringRegExp anzeigen?
    Meine Help hat soetwas nicht.

    Danke @Berti

    Einmal editiert, zuletzt von bertizwo (21. Februar 2007 um 17:53)

    • Offizieller Beitrag

    HI,

    kein Problem viel Spaß.

    Hier mal das Problem aufgeschlüsselt was ich meinte:

    Spoiler anzeigen
    [autoit]


    Global $test = "Sie haben #21,00 oder $100.00 oder 10€ gewonnen"
    $ret = StringRegExp($test, "(\d{1,}[\.|,]\d{0,})|\d{1,}", 3)
    _ArrayDisplay($ret, "Inhalt")

    [/autoit]

    So long,

    Mega

    P.S: Wenn das nicht geht, dann bitte neuste Autoit Version nutzen! & Fehlermeldung posten!

  • Das ist ein sogenannter Regulärer Ausdruck.

    Dieses Konzept existiert in vielen Programmiersprachen und dient dazu Strings nach einem ganz bestimmten Muster zu durchsuchen.
    Man legt ein gewisses Suchmuster fest welches die gesuchte Zeichenkette in einem String haben muss (Bsp: Der Teil beginnt mit 2 beliebigen Buchstaben, dann kommt ein Punkt worauf dann mindestens 2 Zahlen folgen und am Ende dann z.B. ein €-Zeichen).
    Der Code den du meinst ist also nur ein entsprechendes Suchmuster:

    Code
    (\d{1,}[\.|,]\d{0,})|\d{1,}

    bedeutet:

    Der Stringteil den wir suchen beginnt mit einer Zahl ("\d") - mindestens eine Stelle - aber egal wieviele maximal ("{1,}") .
    Darauf folgt dann ein Punkt oder ein Komma ("[\.|,]").
    Dann folgt wieder eine Dezimalzahl ("\d") - muss aber nicht unbedingt ("{0,}").

    Anstatt diesem ganzen Muster kann auch einfach nach einer einfachen Zahl gesucht werden mit mindestens einer Stelle ("|\d{1,}").

    Regular Expressions benötigt etwas Einarbeitungszeit.
    Bei Wikipedia findest du dazu aber gute Links zu Tutorials mit denen man recht schnell klarkommen sollte.

    3 Mal editiert, zuletzt von AspirinJunkie (21. Februar 2007 um 19:28)

  • #include <array.au3>

    Global $test = "Sie haben #21,00 oder $100.00 oder 10€ gewonnen"
    $ret = StringRegExp($test, "(\d{1,}[\.|,]\d{0,})|\d{1,}", 3)
    While 1
    ToolTip($ret,200,200)
    WEnd


    ...zeigt nur 1 an. Wieso ?

    Danke @Berti

  • #include <array.au3>
    Global $ret[10]
    Global $test = "Sie haben #21,00 oder $100.00 oder 10€ gewonnen"

    $ret = StringRegExp($test, "(\d{1,}[\.]\d{0,})|\d{1,}",3)
    While 1
    sleep(200)
    ToolTip($ret[0],200,200)
    WEnd

    bekommt folgende Compilermeldung:
    ==> Subscript used with non-Array variable.:

    Wieso ?

  • Bei mir nicht - kommt "21" - also die erste Fundstelle.
    Allerdings hattest du das Suchmuster angepasst - nun wird keine Zahl mit Nachkommastelle bei einem Komma mit ausgegeben da du einfach das Komma gekillt hast:

    "(\d{1,}[\.|,]\d{0,})|\d{1,}"

    Dementsprechend macht die Einklammerung des "\." (ein Punkt) in die eckigen Klammer keinen Sinn mehr denn diese dient lediglich dazu zwischen einem Pool aus festgelegten Zeichen zu wählen (quasi ein "Oder" - deswegen kann der |-Strich in der Klammer auch weggelassen werden).

    Die vorherige Definition von $ret als Array mit 10 Einträgen kannst du weglassen - das wird eh wieder von der StringRegExp-Funktion überschrieben.
    Auch das Testen über diese Tooltip-Schleife finde ich etwas umständlich.

    Hier nochmal die Variante wie du alle Zahlen darin findest:

    [autoit]

    Global $test = "Sie haben #21,00 oder $100.00 oder 10€ gewonnen"
    $ret = StringRegExp($test, "\d+[\.,]*\d*",3)
    MsgBox(0,"", $ret[0])

    [/autoit]

    Oder versuchst du nur bestimmte Zahlentypen zu finden und nicht alle?

    Einmal editiert, zuletzt von AspirinJunkie (21. Februar 2007 um 21:19)

  • hallo,
    habe Deinen Code 1:1 kopiert und bekomme folgende
    Meldung beim Compilieren:

    Subscript used with non-Array variable.:
    MsgBox(0,"", $ret[2])
    MsgBox(0,"", $ret^ ERROR

    Er erkennt also das Array nicht.
    MsgBox(0,"",$ret) gibt mir nur die 1

    :(

    Danke @Berti

  • Hallo Aspirin..,
    entschuldige bitte mein gnoergel.
    Klein Berti hatte nur die Version von SciTe auf den neuesten Stand gebracht.

    Nach Installation der autoit-v3.2.2.0-setup.exe
    funzelt alles wunderbar!!

    Gruss vom Dummi
    @Berti

    Einmal editiert, zuletzt von bertizwo (21. Februar 2007 um 20:43)

  • Ich bin ja nicht ganz so der dolle progger aber ich les mir hier alle themen durch und geb mein bestes.
    wollt ma fragen obs nicht auch genausogut mit StringBetween gehen würde?

    Also... (ma gucken ob ich AutoIT noch so ausm Kopf proggen kann^__^)

    [autoit]


    $Blub = "Sie haben $100.00 gewonnen"
    $amount = _StringBetween($Blub, "$", " ")
    MsgBox(0, "Geldgewinn", "Gewonnenes Geld: $" &$amount)

    [/autoit]

    Wäre kürzer und meiner meinung nach einfacher :)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]

    Einmal editiert, zuletzt von Blubkuh (21. Februar 2007 um 20:48)

  • bertizwo[Blockierte Grafik: http://www.comicguide.net/images/smilies/daumen.gif]

    Blubkuh
    Wenn du genau Kenntnisse davon hast in welcher Form deine Zahl in einem String auftaucht hast du Recht.
    Hier ging es wohl aber eher darum mal die Vorteile von Regular-Expressions schmackhaft zu machen.

    Beispiel: Mit dem RegExp-Muster hier wärst du nicht nur auf die Zahlen beschränkt welche mit einem "$" beginnen und einem Leerzeichen aufhören.
    Es würden konkret alle gefunden.

    Würde z.B. bei dir das Leerzeichen hinter der Zahl fehlen und es gleich mit einem Wort weitergehen würdest du auch mit _Stringbetween nicht mehr rankommen - einfach weil du nicht weißt welcher Buchstabe genau dahinter kommt.
    Für solche Fälle sind Regular-Expression ideal.