German Anderes Format für Zahlen

JOTHA

Well-Known Member
Licensed User
Ich habe mal eine kurze Frage:

Wie kann ich das Zahlenformat "eindeutschen"?

Bsp:

Die Zahlen kommen in diesem Format:

1,000,000.99

Ich hätte die Zahlen aber gerne in diesem Format:

1.000.000,99

Wie kann ich das bewerkstelligen?

Im voraus besten Dank!
 

klaus

Expert
Licensed User
Direkte Function oder Möglichkeit kenne Ich keine.
Aber mit dieser kleinen Routine geht es.
B4X:
Sub Globals
  'Declare the global variables here.
  a=123456789.5678
End Sub

Sub App_Start
  Form1.Show
  Label1.Text=a
  Label2.Text=Convert(a,2)
End Sub

Sub Convert(Zahl,Dezimalstellen)
  Zahl=Format(Zahl,"N"&Dezimalstellen)
  b=StrReplace(Zahl,".","!")  ' ändert vorläufig die Punkte
  b=StrReplace(b,",",".")     ' tauscht Kommas in Punkte aus
  b=StrReplace(b,"!",",")     ' tauscht Punkte in Kommas aus
  Return b
Return
Beste Grüsse.
 

JOTHA

Well-Known Member
Licensed User
Hallo Klaus,

schön, wieder von Dir zu hören und Danke für deine schnelle Antwort!

... sieht ja ganz schön kompliziert aus, ich probiere es aber trotzdem mal aus.

... melde mich dann wieder, wenn es geklappt hat.
 

specci48

Well-Known Member
Licensed User
Hallo Paulsche,

leider gibt es in Basic4ppc keine eingebaute Funktion zur Umwandlung von Zahlen in andere Schreibweisen. Der Format-Befehl bereitet auch "nur" das englische Format auf. :(

Ich selbst habe das daher bei mir immer mit folgender Hilfsmethode gelöst:
B4X:
Sub ConvertToGerman(value)
   value = StrReplace(value,",","#")
   value = StrReplace(value,".",",")
   Return StrReplace(value,"#",".")
End Sub
Statt
B4X:
Label1.Text = ausgangswert
muss man dann
B4X:
Label1.Text = ConvertToGerman(ausgangswert)
verwenden.

Das ist allerdings nur bei reinen Ausgabefeldern sinnvoll, da man anschliessend mit den konvertierten Feldern z.B. nicht mehr weiterrechnen kann.


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Hallo specci48,

vielen Dank auch an deine Adresse!

leider habe ich aber diverse "Problemchen" mit der neuen Version 6.50.
Ich habe gleich mal das mit den Modulen ausprobiert, aber ich kann natürlich die
"App_Start"-Zeile von Klaus nicht in einem der Module verwenden.

Da müßte ich jetzt wahrscheinlich irgendwelche Verweise einfügen.

Ich hatte schon einige Experimente gebraucht, bis ich rausgefunden habe, wie man Verweise nur zum Aufruf von Seiten, die in den Modulen waren machen konnte.

Auf jeden Fall werde ich auch deine Hilfestellung ausprobieren und mich dann wieder melden.

DANKE.
 
Last edited:

specci48

Well-Known Member
Licensed User
@Klaus: :sign0013: aber ich war ein wenig langsam mit meiner Antwort und haben wir uns dann wohl überschnitten...
Positiv zu bemerken ist, dass wir im Prinzip beide eine identische Lösung verwenden. :)


Gruß
specci48
 

klaus

Expert
Licensed User
Hallo JOTHA,
Die 2 Zeilen in der AppStart Routine können auch anderwo sein, also auch in einem Modul.
Die Convert Routine könnte auch in einem Modul sein, nur muss sie als Public gekennzeichnet werden. Und für den Aufruf muss dann der Modulname mit einem Punkt davor gesetzt werden Modul1.Convert.

Hallo specci48,
Ja die Lösung die gleiche. Ich habe in meine Routine noch das Format eingebunden um auch die Kommas im Englischen Format reinzubekommen.

Beste Grüsse.
 

JOTHA

Well-Known Member
Licensed User
Es funzt jetzt!

Hallo Klaus und specci48,

dank eurer Hilfe bin ich jetzt nach vielen Experimenten auf den Trichter gekommen. Anbei jetzt mein Beispiel, damit auch andere was davon haben.

Allerdings funktioniert es noch einfacher als von euch beschrieben:

1) @Klaus:
Die Convert Routine könnte auch in einem Modul sein, nur muss sie als Public gekennzeichnet werden.
Habe ich nicht gemacht -> es funzt trotzdem ...

2) @Klaus:
Und für den Aufruf muss dann der Modulname mit einem Punkt davor gesetzt werden Modul1.Convert.
Habe ich bei meinen Modulen nicht gemacht (nicht in diesem angehängten Beispiel) -> es funzt trotzdem ...

3) @specci48:
Das ist allerdings nur bei reinen Ausgabefeldern sinnvoll, da man anschliessend mit den konvertierten Feldern z.B. nicht mehr weiterrechnen kann.
Vielen Dank für diesen wichtigen Hinweis!
Wenn ich also einmal mit Zahlen rechnen muß, dann nehme ich nicht die "konvertierte" Zahl, sondern ich schreibe die echte Zahl in ein unsichtbares Feld und rechne von da aus weiter.

4) Noch eine Frage an Klaus:
In deinem Code steht unten 2 mal "Return"
B4X:
Sub Convert(Zahl,Dezimalstellen)
  Zahl=Format(Zahl,"N"&Dezimalstellen)
  b=StrReplace(Zahl,".","!")  ' ändert vorläufig die Punkte
  b=StrReplace(b,",",".")     ' tauscht Kommas in Punkte aus
  b=StrReplace(b,"!",",")     ' tauscht Punkte in Kommas aus
  Return b
Return
Ich habe das letzte "Return" gelöscht, es funzt trotzdem. Für was ist das nützlich?
... und dann müßte da auch noch ein "End Sub" dran, oder? ;)

Vielleicht mache ich ja einen Denkfehler und auch die "Public"-Verweise und "Global"-Angaben sind am Ende doch noch sehr wichtig?

Schaut euch doch bitte mal das kleine Beispiel nochmal an und sagt mir, ob ich auf dem Holzweg bin ...

Auf jeden Fall wollte ich mich nochmals bei euch beiden herzlich bedanken, denn ohne eure Hilfe wäre ich da nicht weitergekommen! :sign0188:
 

Attachments

Last edited:

specci48

Well-Known Member
Licensed User
Allerdings funktioniert es noch einfacher als von euch beschrieben:
Ehrlich gesagt, Deine Variante ist komplett identisch zu der von Klaus. Ich habe "nur" auf die Aufbereitung von zwei Nachkommastellen verzichtet.

1) @Klaus:
Quote:
Die Convert Routine könnte auch in einem Modul sein, nur muss sie als Public gekennzeichnet werden.
Habe ich nicht gemacht -> es funzt trotzdem ...

2) @Klaus:
Quote:
Und für den Aufruf muss dann der Modulname mit einem Punkt davor gesetzt werden Modul1.Convert.
Habe ich bei meinen Modulen nicht gemacht (nicht in diesem angehängten Beispiel) -> es funzt trotzdem ...
Das kann eigentlich nicht sein. Hast Du die Convert-Methode etwa in jedes Modul kopiert? Dann geht es natürlich ohne Public-Deklaration und ohne Modulname. Interessant ist aber gerade die Variante, eine Sub nur ein einziges mal in einem einzigen Modul zu pflegen.

Ich habe das letzte "Return" gelöscht, es funzt trotzdem. Für was ist das nützlich?
Für nichts, denn es ist genau genommen ein Fehler...

... und dann müßte da auch noch ein "End Sub" dran, oder?
Aber sicher!


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Ehrlich gesagt, Deine Variante ist komplett identisch zu der von Klaus.
So war es ja auch nicht gemeint. Wie gesagt: ohne Euch hätte ich das sowieso nicht geschafft ...

Ich meinte nur das mit den "Public", "Modul", etc.-Verweisen.

Aber jetzt weiß ich ja, für was die sind:
Hast Du die Convert-Methode etwa in jedes Modul kopiert? Dann geht es natürlich ohne Public-Deklaration und ohne Modulname. Interessant ist aber gerade die Variante, eine Sub nur ein einziges mal in einem einzigen Modul zu pflegen.
... genau, ich habe die in jedes Modul kopiert ...
Aber so, wie Ihr das macht ist es natürlich intelligenter!

Ich lerne halt noch.

Danke nochmals!
 

specci48

Well-Known Member
Licensed User
So war es ja auch nicht gemeint. Wie gesagt: ohne Euch hätte ich das sowieso nicht geschafft ...
War auch nicht böse gemeint, aber ich habe einfach den Unterschied nicht gesehen...:sign0013:

Ich lerne halt noch.
Wir auch! Gerade in Bezug auf die neue Modultechnik sind wir (mit Ausnahme der Beta-Tester) alle wieder Anfänger. Daher immer hübsch weiterfragen, denn oftmals freut man sich auch beim Suchen, dass eine Frage schon vorab gestellt und bereits beantwortet wurde.


Gruß
specci48
 

klaus

Expert
Licensed User
Hallo Ihr Beiden.
War ein Paar Tage weg, bin jetzt wieder zurück.

Klar ist das zweite Return ein FEHLER und muss mit durch ein End Sub ersetzt werden.
Das war wahrscheinlich ein ganz alter Basic Reflex von mir von früher.
Komischerwieser funktioniert es aber.

Beiliegend Dein Beispiel mit der Konvertierungsroutine in einem andern Modul so wie Ich es meinte.

specci48, Du hast vollkommen Recht wir lernen Alle noch und speziell mit Fragen und Antworten von Anderen. Ich (wir) mache(n) auch manchmal noch Fehler. Das ist ja auch der Grund und Vorteil dieses Forum's.

Beste Grüsse.
 

Attachments

specci48

Well-Known Member
Licensed User
Beiliegend Dein Beispiel mit der Konvertierungsroutine in einem andern Modul so wie Ich es meinte.
Nicht so geizig... ;)
Die Datei Routinen.bas musst Du uns natürlich auch noch zur Verfügung stellen! :signOops:

Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
... und was heißt jetzt "Public Sub"?

... daß diese Sub für alle Module gilt?

:confused:
 

klaus

Expert
Licensed User
Genau !

Variablen und Routinen können in jedem Modul definiert werden.
Wenn sie nur in dem Modul, wo sie definiert worden sind, genützt werden sollen gilt die 'normale' Definition wie es bis jetzt war oder man kann auch für Variablen Dim durch Private ersetzen und für Routinen Private vor Sub eingeben.
Für Variablen und Routinen die von auswärts des Moduls, wo sie definiert worden sind, genützt werden sollen muss das Wort Private durch Public esrsetzt werden oder eingefügt werden mit den gleichen Regeln wie für das Wort Private.
Um diese Variablen und Routinen von auswärts aufrufen zu können muss man den Variablen- und Routinennamen den Modulnamen mit einem Punkt davor setzten.

Du kannst auch hier mal reinschauen, das ist eine Übersetzung vom Englischen Erklärungstext über die Neuerungen in der Vesrion 6.50 von BasicPPC.
http://www.basic4ppc.com/forum/german-forum/3132-neue-version-6-5-a.html

Grüsse.
 

JOTHA

Well-Known Member
Licensed User
Hallo Klaus,

DANKE für die gute Erklärung.

In den thread mit der deutschen Erklärung der Neuerungen in 6.5 für Paulsche habe ich schon vorher reingeschaut.

Eigentlich könnte man ja dann für alle Subs den Begriff "Public" davorstellen. Wenn man die Sub nicht benötigt, braucht man ja nicht darauf zugreifen, oder?
 

klaus

Expert
Licensed User
Hallo JOTHA,

Eigentlich hast Du Recht.
Denn mehrere Routinen mit gleichem Namen in verschiedenen Modulen, haben von aussen gesehen verschiedene Namen durch den Modulnamen den man voran setzten muss.
Für eine 'saubere' Programmierung schlage Ich aber vor anstatt Public, Private vorzusetzten wenn die Routine nur im gleichen Modul verwendet wird, und nicht Public oder nichts. Das garantiert eine bessere Verkapselung.

Ich kenne diese Public und Private Keywords von VisualBasic, wo es etwas anders funktioniert. Eine Routine die public benannt wird, behält Ihren Namen ohne dem Modulnamen, auch von aussen, das heisst dass zwei Routinen mit gleichem Namen beide nicht als public benannt werden können. Das gleiche gilt auch für Variablen.

Beste Grüsse.
 

Paulsche

Well-Known Member
Licensed User
Hi, muss das Thema nochmals aufgeifen.

Ich schreib gerade ein Prog zum Benzinverbrauch und hab folgende Probleme:

Mit dem hier beschriebenen Convertierungs-SUB kann ich ja die Anzeige ins Deutsche Format konvertieren, aber nicht die Eingabe der Daten im deutschen Format vornehmen, richtig ?

Denn wenn ich meine CSV-Tabelle im Excel öffne, wird mir der Kilometerstand nicht als 50.000 sondern als 50 angezeigt.

Dies denke ich kann ich nur damit lösen, dass ich einen extra CSV-Export für die Excel-Ausgabe erstelle, wo ich beim Export die ganzen Cellen convertiere, richtig ?

Kann ich irgendwie gestalten, dass die Eingabe im deutschen Format erfolgen kann oder geht das nicht ? Ich muss halt mit den Cellen auch rechnen können.
Ansonsten müsste ich halt irgenwie verhindern dass im deutschen Format eingegeben werden kann.
 
Top