Ein Zeichen innerhalb einer Zeichenkette einfügen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Ein Zeichen innerhalb einer Zeichenkette einfügen

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by nacken012 » 09 Mar 2019, 02:06

Vielen Dank, das klappt perfekt :-)

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by nnnik » 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

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by nacken012 » 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.")

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by just me » 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.

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by nacken012 » 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.

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by Scr1pter » 04 Mar 2019, 15:21

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

Grüße

Re: Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by just me » 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

Ein Zeichen innerhalb einer Zeichenkette einfügen

Post by Scr1pter » 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

Top