Ein Zeichen innerhalb einer Zeichenkette einfügen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Scr1pter
Posts: 1203
Joined: 06 Aug 2017, 08:21
Location: Germany

Ein Zeichen innerhalb einer Zeichenkette einfügen

03 Mar 2019, 13:35

Hi,

hab wohl gerade einen kleinen Denkfehler.

Ich möchte gerne prüfen, ob sich innerhalb einer Zeichenkette ein Punkt nach einer Ziffer befindet.
Ist dies nicht der Fall, soll ein Punkt eingefügt werden.

Beispiel:
Aus 55 Das ist ein Test soll 55. Das ist ein Test gemacht werden.

Mit RegExReplace habe ich es hinbekommen:
Clipboard := RegExReplace(Clipboard, "(\d\d)", "$1.") ; Punkt nach 2 Ziffern einfügen

Das Problem hierbei ist, dass es egal ist ob ein Punkt vorhanden ist oder nicht.
Außerdem würde es bei ungleich 2 Ziffern zu Fehlern kommen.

Daher eine andere Variante, die fast funktioniert:

Code: Select all

;Punkt nach Ziffern einfügen
F5::
var = 55 das ist ein test
position = 0 ; Wert zu Beginn auf 0 setzen
Loop ; Endlosschleife, die verlassen wird, sobald keine Ziffer im Dateinamen mehr vorkommt
{
  position++ ; Die Position in jedem Durchgang inkrementieren (Erstes Zeichen -> Zweites Zeichen usw.)
  zeichen := SubStr(var, position, 1) ; Zeichen an der aktuellen Position ermitteln
  if zeichen is not number ; Wenn an der aktuellen Position keine Ziffer vorhanden ist:
  {
    if zeichen != . ; Und wenn es kein Punkt ist:
    {
      var := SubStr(var, 1, position) "." SubStr(var, position) ; Einen Punkt an der ermittelten Position einfügen
      MsgBox, %var%, %position% ; Neue Variable und Position in Info-Message anzeigen
      break ; Schleife verlassen
    }
    else ; Wenn es ansonsten ein Punkt ist:
    {
      MsgBox, Ja, ist ein Punkt! ; Info-Message
      break ; Schleife verlassen, kein SubString durchführen
    }
  }
}
return
.
.
.
Leider gibt's 2 Unklarheiten:
1)
Wie bekomme ich das Leerzeichen nach der Ziffer weg?

2)
Kann ich die if-Abfrage kombinieren?
Ich hatte bereits einiges ausprobiert:
if (zeichen is not number and zeichen != .)
if (zeichen is not number) and (zeichen != .)
if ( zeichen is not number ) and ( zeichen != . )
if zeichen is not number and zeichen != .
auch mit "." statt .

Danke für jede Hilfe!

Grüße
Please use [code][/code] when posting code!
Keyboard: Logitech G15 FE - Mice: Logitech G9 FE, G502 FE, G602, Jelly Comb Touchpad - OS: Windows 10 Pro 64 Bit - AHK version: 1.1.32.00
just me
Posts: 7243
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen  Topic is solved

04 Mar 2019, 03:20

Moin,

Deine zweite Methode macht mir Kopfschmerzen.
1. Du prüfst nicht, ob vor dem 'NichtPunkt' überhaupt eine Ziffer steht.
2. Du brichst das Ersetzen nach dem ersten 'Treffer' ab.

Der RegEx dagegen könnte so funktionieren:

Code: Select all

Var := "55 Das ist ein Test"
MsgBox, % RegExReplace(Var, "(\d+)(\s)", "$1.$2")
Bedeutung: Wenn auf eine oder mehr Ziffern ein 'leeres' Zeichen folgt, ersetze das durch die Folge Ziffern-Punkt-Leerzeichen.

P.S.: if zeichen is not number ist in AHK v1 "Kommandosyntax" und kann deshalb nicht in einer If Anweisung mit anderen Bedingungen kombiniert werden
User avatar
Scr1pter
Posts: 1203
Joined: 06 Aug 2017, 08:21
Location: Germany

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

04 Mar 2019, 15:21

Danke dir, das klappt einwandfrei :thumbup:
Und ebenfalls danke für die Info mit der if-Anweisung!

Grüße
Please use [code][/code] when posting code!
Keyboard: Logitech G15 FE - Mice: Logitech G9 FE, G502 FE, G602, Jelly Comb Touchpad - OS: Windows 10 Pro 64 Bit - AHK version: 1.1.32.00
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

08 Mar 2019, 01:31

Hallo

Also das klappt gut, aber kann man auch von hinten aus gesehen den Punkt einfügen ?

Clipboard := RegExReplace(Clipboard, "(\d\d)", "$1.") ; Punkt nach 2 Ziffern einfügen

bin ich wohl zu blöd für um das hinzubekommen.

Habe was geschrieben wo mit man im Spiel seine Sammlungen eingeben kann um dann ausrechnen zu lassen, wie viel Geld man hat.

Nur müssten jetzt die Punkte hinten eingefügt werden.
just me
Posts: 7243
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

08 Mar 2019, 02:22

Moin nacken12,

dazu habe ich zwei Fragen:
  1. Warum lässt Du die Punkte bei der Eingabe weg, wenn sie später gebraucht werden?
  2. Was verstehst Du unter 'von hinten aus gesehen''? Gib mal bitte mindestens ein 'vorher/nachher' Beispiel.
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

08 Mar 2019, 05:15

Hallo

Mal ein Beispiel:
Man hat z.B. von einer Sammlung 1235, bei jedem Einlösen bekommt man 8.000 Münzen

Gibt man jetzt alle Sammlungen ein, es gibt insgesamt 8, dann kommt als Zahl z.B. raus:

1024015000

Wenn ich jetzt von vorne die Punkte setzen lasse, sieht es dann so aus:

102.401.500.0

Es sind ja aber nicht 102 Millionen usw...

Sondern 1 Milliarde und müsste so aussehen:

1.024.015.000

darum meinte ich von hinten an den Punkt setzen

Das Beispiel oben lautet natürlich:
Clipboard := RegExReplace(Clipboard, "(\d\d\d)", "$1.")
User avatar
nnnik
Posts: 4470
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

08 Mar 2019, 06:09

Dafür hätte ich die folgende idee:
Man sucht nach 3 Zahlen nach denen direkt danach keine Zahl mehr steht jedoch sich eine davor befindet.
Danach fügt man den Punkt zwischen diesen 3 und der Zahl davor ein.
Wenn man den Vorgang wiederholt werden diese 3 Zahlen nun nicht mehr gefunden, da vor ihnen keine Zahl sondern ein Punkt ist.
Wenn nun mehr als 3 Zahlen vor den 3 Zahlen am Ende stehen, dann werden diese nun gefunden, da eine Zahl vor ihnen steht und auf sie ein Punkt (eine nicht Zahl) folgt.

Der reguläre Ausdruck hierfür lautet:
(\d)(\d\d\d(?:\D|$)) =
eine Zahl \d
dann drei Zahlen \d\d\d
dann eine nicht \D Zahl oder | das Ende des Textes $

Dieses wendet man so lange auf einen Text an bis dieser sich nicht mehr verändert:

Code: Select all

text := "123456789"

while (oldText != (text := RegExReplace(text, "(\d)(\d\d\d(?:\D|$))", "$1.$2")))
	oldText := text

Msgbox % text
Recommends AHK Studio
nacken012
Posts: 71
Joined: 22 Jul 2016, 14:39

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

09 Mar 2019, 02:06

Vielen Dank, das klappt perfekt :-)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 2 guests