Discussion:
in Double-Zahl Komma durch Punkt ersetzen
(zu alt für eine Antwort)
Hartmut Callies
2009-06-04 21:02:10 UTC
Permalink
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.

Wie kann das erreichen?

Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.

Hartmut Callies
Kerem Gümrükcü
2009-06-04 21:21:36 UTC
Permalink
Hallo Hartmunt,

wenn das CAD Program diese Angabe als String erwartet, dann
ist das recht einfach, in dem Du einfach das "," durch einen "."
ersetzt. So ein änliches Probel hatten wir auch mal, dass das
Grafikprogram eine gesondert formatierte Zahl benötigt hat.

Dim SomeDouble As Double
SomeDouble = 123.456

MessageBox.Show(SomeDouble.ToString() + vbCrLf +
SomeDouble.ToString().Replace(",", "."))

Ansonsten kannst Du mit dem ToString() auch die Formatierung angeben (siehe
Überladungen!)
und u.U. kannst Du mit regulären Ausdrücken arbeiten um ggf. komplexere
Zeichenketten zu
erzeugen, wenn dein CAD Program bestimmte Eingabeformate erwartet,...

Grüße

Kerem
--
--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/software/deviceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
-----------------------
"This reply is provided as is, without warranty express or implied."
Post by Hartmut Callies
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Hartmut Callies
Martin H.
2009-06-04 21:27:58 UTC
Permalink
Hallo Hartmut,

der Typ Double (auch Single und Dezimal) kennen kein Komma und keinen
Punkt. Diese Trennzeichen hängen von den jeweiligen Landeseinstellungen
(Stichwort: Culture) ab. Wenn das CAD-Programm Zahlen mit einem Punkt
als Dezimaltrenner erwartet, dann musst Du nach String wandeln und
als Culture z.B. en-us vorgeben.

Falls Du über eine Schnittstelle gehst, dann übergib einfach einen
Double-Wert, denn dann ist es so, dass das CAD-Programm den Double-Wert
einfach nur mit dem Dezimalpunkt ausgibt und sich nicht um
Landeseinstellungen kümmert.

Beste Grüße,

Martin
Post by Hartmut Callies
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Hartmut Callies
Martin H.
2009-06-04 21:52:18 UTC
Permalink
Hallo Hartmut,

der folgende Codeschnipsel zeigt die Konvertierung einer Double in
einen String. Auf einem System mit deutschen Windowseinstellungen
erscheint beim 1. MsgBox-Aufruf "3,14159265". Beim 2. Aufruf erscheint
immer "3.14159265".

Beste Grüße,

Martin

Dim d As Double = 3.15159265#
MsgBox(d.ToString)
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))
Post by Martin H.
Hallo Hartmut,
der Typ Double (auch Single und Dezimal) kennen kein Komma und keinen
Punkt. Diese Trennzeichen hängen von den jeweiligen Landeseinstellungen
(Stichwort: Culture) ab. Wenn das CAD-Programm Zahlen mit einem Punkt
als Dezimaltrenner erwartet, dann musst Du nach String wandeln und
als Culture z.B. en-us vorgeben.
Falls Du über eine Schnittstelle gehst, dann übergib einfach einen
Double-Wert, denn dann ist es so, dass das CAD-Programm den Double-Wert
einfach nur mit dem Dezimalpunkt ausgibt und sich nicht um
Landeseinstellungen kümmert.
Beste Grüße,
Martin
Post by Hartmut Callies
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Hartmut Callies
Armin Zingler
2009-06-04 21:45:08 UTC
Permalink
Post by Hartmut Callies
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Double hat weder Komma noch Punkt. Deswegen passen die beiden Forderungen
nicht zusammen.
Post by Hartmut Callies
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Wie wird der Wert übergeben? Wenn ein Format vorgeschrieben ist, kann es nur
ein String sein. Wie Kerem schon schrieb kannst du eine Überladung von
ToString für die Konvertierung verwenden:

Dim d As Double = 123.456
Dim s As String

s = d.ToString(Globalization.CultureInfo.InvariantCulture.NumberFormat)
MsgBox(s)


Armin
Karsten Sosna
2009-06-05 05:55:13 UTC
Permalink
Post by Hartmut Callies
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Hallo Hartmut,
anscheinend ist Dir nicht bewußt, was Double ünerhaupt bedeutet. Dass das
Komma oder Punkt lediglich von der Kultur abhängig und nur der Darstellung
dient, ist das lediglich eine Schreibweise. Aber das haben Dir die anderen
ja schon versucht zu beschreiben. Double bedeutet lediglich nach IEEE-754,
dass der Wert intern als 64Bit Wert gespeichert wird, im Gegensatz zu Single
wo es nur 32Bit breit sind. Diese Fließkommazahlen werden durch 3
Komponenten beschrieben. Dem Vorzeichen, dem Exponent und der Mantisse,
letztere ist auschlaggebend für die Genauigkeit. So hat
Single 1Bit Vorzeichen, 8Bit Exponent, 23Bit Mantisse
und Double 1Bit Vorzeichen, 11Bit Exponent, 52Bit Mantisse.
Hier werden keine Dezimaltrenner gespeichert. Genau genommen ist die
Mantisse eine Zahl die kleiner Null ist(Normalisierter Zustand). Erst mit
der Verrechnung des Exponent entsteht dann ein Wert, den wir Menschen
"greifen" können. Durch die Breite der Mantisse entsteht dann auch die
Genauigkeit. Bei Single nennt man 7-8 Dezimalstellen, bei Double hingegen
15-16 Dezimalstellen. Wie man das ingesammt realisiert und wie FPU damit
rechnet findest zu Hauf im Netz.

Zu Deinem CAD-Programm. Mir ist noch nie eine Anwendung untergekommen, die
ein Komma als Dezimaltrenner entgegennehmen nehmen. Aber die Aussage das sie
den Punkt als Dezimaltrenner benutzen sagt schon aus das sie nicht mit dem
Wertetyp Double als Übergabeparameter arbeiten, sondern mit einem String.
Mit welcher Genauigkeit dann wirklich gerechnet wird kann Dir nur der
Entwickler sagen, aber ich kann nur aus Erfahrungen nennen, dass sie intern
eh nur mit Single arbeiten was für solche Anwendungen völlig ausreicht.
Beispiel: Eine Wand sei 9542.3845mm lang, mehr brauch man wohl gar nicht
sagen. Ich möchte gerne den Maurer kennenlernen, der mir eine 9.5423845
Meter lange Mauer errichtet. Wie Du siehst liegt das ausserhalb jeglicher
Realität.
Das was Deine Anwendung haben will ist dass Du Fließkommazahlen(und dazu
gehören Single und Double) als String übergibst, das wars. Von Genauigkeit
steht da sicherlich nichts.
--
Gruß Scotty
Peter Fleischer
2009-06-05 06:12:56 UTC
Permalink
... Diese Fließkommazahlen werden durch 3 Komponenten beschrieben. Dem
Vorzeichen, dem Exponent und der Mantisse, letztere ist auschlaggebend für
die Genauigkeit. So hat
Single 1Bit Vorzeichen, 8Bit Exponent, 23Bit Mantisse
und Double 1Bit Vorzeichen, 11Bit Exponent, 52Bit Mantisse.
Hi Karste,
wenn du es schon so genau darstellst, dann bitte auch konsequent :-)

...
Double hat 1Bit Vorzeichen Mantisse, 1 Bit Vorzeichen Exponent, 10 Bit
Exponent, 52Bit Mantisse OHNE MSB, welches nach der Normalisierung immer
ausgeblendet wird!!!
...
Zu Deinem CAD-Programm. Mir ist noch nie eine Anwendung untergekommen, die
ein Komma als Dezimaltrenner entgegennehmen nehmen. Aber die Aussage das
sie den Punkt als Dezimaltrenner benutzen sagt schon aus das sie nicht mit
dem Wertetyp Double als Übergabeparameter arbeiten, sondern mit einem
String.
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
--
Viele Grüsse
Peter
Kerem Gümrükcü
2009-06-05 06:47:47 UTC
Permalink
Guten Morgen!
Post by Peter Fleischer
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
Genau diese Frage stelle ich mir auch, daher auch meine extrem
simplifizierte Lösung mit dem ersetzten des Komma durch einen
Punkt,...oder umgekehrt,...

Grüße

Kerem
--
--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/software/deviceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
-----------------------
"This reply is provided as is, without warranty express or implied."
Post by Peter Fleischer
... Diese Fließkommazahlen werden durch 3 Komponenten beschrieben. Dem
Vorzeichen, dem Exponent und der Mantisse, letztere ist auschlaggebend
für die Genauigkeit. So hat
Single 1Bit Vorzeichen, 8Bit Exponent, 23Bit Mantisse
und Double 1Bit Vorzeichen, 11Bit Exponent, 52Bit Mantisse.
Hi Karste,
wenn du es schon so genau darstellst, dann bitte auch konsequent :-)
...
Double hat 1Bit Vorzeichen Mantisse, 1 Bit Vorzeichen Exponent, 10 Bit
Exponent, 52Bit Mantisse OHNE MSB, welches nach der Normalisierung immer
ausgeblendet wird!!!
...
Zu Deinem CAD-Programm. Mir ist noch nie eine Anwendung untergekommen,
die ein Komma als Dezimaltrenner entgegennehmen nehmen. Aber die Aussage
das sie den Punkt als Dezimaltrenner benutzen sagt schon aus das sie
nicht mit dem Wertetyp Double als Übergabeparameter arbeiten, sondern mit
einem String.
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
--
Viele Grüsse
Peter
Peter Fleischer
2009-06-05 06:58:58 UTC
Permalink
Post by Kerem Gümrükcü
Post by Peter Fleischer
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
Genau diese Frage stelle ich mir auch, daher auch meine extrem
simplifizierte Lösung mit dem ersetzten des Komma durch einen
Punkt,...oder umgekehrt,...
Hi Kerem,
das Ersetzen ist keine gute Idee:

3.456,78 ergibt nach dem Ersetzen 3.456.78

Ob das unbekannte Cad-System damit zurecht kommt :-) ?
--
Viele Grüsse
Peter
Kerem Gümrükcü
2009-06-05 07:24:51 UTC
Permalink
Hallo Peter,
Post by Peter Fleischer
3.456,78 ergibt nach dem Ersetzen 3.456.78
ja, das könnte man so nicht nehmen, aber selbst
dann könntest Du die Zahl zerlegen und wieder
zsuammensetzten, das alles mit String oder Regulären
Ausdrücken, das wäre kein Problem. Du weisst, wie ich
das meine,...
Post by Peter Fleischer
Ob das unbekannte Cad-System damit zurecht kommt :-) ?
Sicherlich nicht, aber wie Du sagst, wäre es u.U. schon
ein großer Gewinn, wenn wir wüssten, "was" er da für ein
CAD hat,...sonst ist das die Suche der berühmten Nadel im
bekannten Heuhaufen,....nach einem unbekannten CAD
Program! *g*

Grüße

K.
--
--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/software/deviceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
-----------------------
"This reply is provided as is, without warranty express or implied."
Post by Peter Fleischer
Post by Kerem Gümrükcü
Post by Peter Fleischer
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
Genau diese Frage stelle ich mir auch, daher auch meine extrem
simplifizierte Lösung mit dem ersetzten des Komma durch einen
Punkt,...oder umgekehrt,...
Hi Kerem,
3.456,78 ergibt nach dem Ersetzen 3.456.78
Ob das unbekannte Cad-System damit zurecht kommt :-) ?
--
Viele Grüsse
Peter
Karsten Sosna
2009-06-05 07:34:43 UTC
Permalink
Post by Peter Fleischer
wenn du es schon so genau darstellst, dann bitte auch konsequent :-)
..., 1 Bit Vorzeichen Exponent,
Hallo Peter,
das ist falsch, der Exponent besitzt kein Vorzeichen!
Der Exponent wird um den Bias reduziert dabei ergeben sich dann ggf.
negative Werte für den Exponenten. Bei Double ist der Bias 1023( 2 ^ 11 /
2 - 1). Aber sooo genau will der OP das sicherlich nicht wissen. ;=)
Post by Peter Fleischer
Post by Karsten Sosna
Zu Deinem CAD-Programm. Mir ist noch nie eine Anwendung untergekommen,
die ein Komma als Dezimaltrenner entgegennehmen nehmen. Aber die Aussage
das sie den Punkt als Dezimaltrenner benutzen sagt schon aus das sie
nicht mit dem Wertetyp Double als Übergabeparameter arbeiten, sondern mit
einem String.
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
Meine Vermutung ist das Wertetypen wie Double oder Single falsch
interprtiert werden könnten, da sie meist als Referenz übergeben werden.
Damit könntest Du einem Double-Parameter auch einen Single-Parameter
übergeben, welches letzendlich zu einem Fehler führt. String ist hier
"pflegeleichter" sobald man sich auf den Dezimaltrenner geeinigt hat.
Tausendertrenner können dann einfach ignoriert werden und die Wandlung in
den Zieldatentyp ist kein Problem mehr.
--
Gruß Scotty
Peter Fleischer
2009-06-05 07:54:49 UTC
Permalink
Post by Kerem Gümrükcü
Post by Peter Fleischer
wenn du es schon so genau darstellst, dann bitte auch konsequent :-)
..., 1 Bit Vorzeichen Exponent,
Hallo Peter,
das ist falsch, der Exponent besitzt kein Vorzeichen!
Der Exponent wird um den Bias reduziert dabei ergeben sich dann ggf.
negative Werte für den Exponenten. Bei Double ist der Bias 1023( 2 ^ 11 /
2 - 1). Aber sooo genau will der OP das sicherlich nicht wissen. ;=)
Hi Karsten,
unter Berücksichtigung des MSB ist das wohl dasselbe:-) Ob ich das MSB des
Exponenten als Vorzeichen interpretiere und die Mantisse mit dem
unterdrückten MSB damit bewerte oder erst eine Bias-Berechnung durchführe
und dann das 1-Bit voranstelle, ergibt doch das gleiche Ergebnis.
Post by Kerem Gümrükcü
Post by Peter Fleischer
Post by Karsten Sosna
Zu Deinem CAD-Programm. Mir ist noch nie eine Anwendung untergekommen,
die ein Komma als Dezimaltrenner entgegennehmen nehmen. Aber die Aussage
das sie den Punkt als Dezimaltrenner benutzen sagt schon aus das sie
nicht mit dem Wertetyp Double als Übergabeparameter arbeiten, sondern
mit einem String.
Und da bleibt die Frage, wieso String? Das Objektmodell von AutoCad
beispielsweise will keine String-Typen, sondern Double-Werte. Interessant
wäre zu wissen, um welches Cad-System es sich handelt.
Meine Vermutung ist das Wertetypen wie Double oder Single falsch
interprtiert werden könnten, da sie meist als Referenz übergeben werden.
Ich kenne das Objektmodell von AutoCad und da gibt es bei typgerechter
Übergabe keine Interpretationsspielräume.
Post by Kerem Gümrükcü
Damit könntest Du einem Double-Parameter auch einen Single-Parameter
übergeben, welches letzendlich zu einem Fehler führt.
Nein, beim "widening" gibt es keinen Fehler, da die Mantisse nur
rechtsbündig mit Nullen aufgefüllt wird.
Post by Kerem Gümrükcü
String ist hier "pflegeleichter" sobald man sich auf den Dezimaltrenner
geeinigt hat.
Das meinst du wohl nicht im Ernst? Nicht typgerechte Arbeitsweise soll
"pflegeleichter" sein?
Post by Kerem Gümrükcü
Tausendertrenner können dann einfach ignoriert werden und die Wandlung in
den Zieldatentyp ist kein Problem mehr.
Wie stellst du dir die Ignorierung denn vor?

Ein Anwender in der Schweiz gibt ein: 3'456,78

Solch ein "Ignorierungsalgorithmus" kann dann ganz schön kompliziert werden.

Besser ist es, gleich typgerecht zu arbeiten und eintreffende Zecihketten
mit den Standardmitteln unter Berücksichtigung der dazugehörigen Kultur in
den richtigen Zieltyp umzuwandeln. Wenn dann das Cad-System Zeichenketten in
invarianter Kultur haben will, dann kann man diese tygerechten Variablen
wieder in Zeichketten umwandeln und dabei InvariantCulture nutzen.
--
Viele Grüsse
Peter
--
Viele Grüsse
Peter
Karsten Sosna
2009-06-05 18:38:41 UTC
Permalink
Post by Peter Fleischer
unter Berücksichtigung des MSB ist das wohl dasselbe:-) Ob ich das MSB des
Exponenten als Vorzeichen interpretiere und die Mantisse mit dem
unterdrückten MSB damit bewerte oder erst eine Bias-Berechnung durchführe
und dann das 1-Bit voranstelle, ergibt doch das gleiche Ergebnis.
Hallo Peter,
das ist es nicht. Du kannst für ein Formt auch ein Bias vorschreiben(bei
Temperaturangaben völlig normal)
Damit erhälts Du eine Unsymetrie im Darstellungsbereich. Ist absolut
legitim.
Post by Peter Fleischer
Post by Karsten Sosna
Meine Vermutung ist das Wertetypen wie Double oder Single falsch
interprtiert werden könnten, da sie meist als Referenz übergeben werden.
Ich kenne das Objektmodell von AutoCad und da gibt es bei typgerechter
Übergabe keine Interpretationsspielräume.
Post by Karsten Sosna
Damit könntest Du einem Double-Parameter auch einen Single-Parameter
übergeben, welches letzendlich zu einem Fehler führt.
Nein, beim "widening" gibt es keinen Fehler, da die Mantisse nur
rechtsbündig mit Nullen aufgefüllt wird.
Ok dann habe ich wohl im Fach "Grundlagen der Informatik" nicht aufgepasst.
;)
Post by Peter Fleischer
Post by Karsten Sosna
String ist hier "pflegeleichter" sobald man sich auf den Dezimaltrenner
geeinigt hat.
Das meinst du wohl nicht im Ernst? Nicht typgerechte Arbeitsweise soll
"pflegeleichter" sein?
Du hast es nicht verstanden. :=(
Post by Peter Fleischer
Post by Karsten Sosna
Tausendertrenner können dann einfach ignoriert werden und die Wandlung in
den Zieldatentyp ist kein Problem mehr.
Wie stellst du dir die Ignorierung denn vor?
Und hier hast es auch nicht verstanden :=(
Post by Peter Fleischer
Ein Anwender in der Schweiz gibt ein: 3'456,78
Das erschalge ich mit mit eine RagEx-Ausdruck und es gibt nichts mehr außer
dem Dezimaltrenner. Das Resultat wird versuch zu Parsen. Schlägt es
fehl...sorry da kann ich auch nichts zu.
Post by Peter Fleischer
Solch ein "Ignorierungsalgorithmus" kann dann ganz schön kompliziert werden.
Quatsch!
Post by Peter Fleischer
Besser ist es, gleich typgerecht zu arbeiten
Ist aber nicht immer gegeben (siehe Gerber-Daten)
Post by Peter Fleischer
und eintreffende Zecihketten mit den Standardmitteln unter
Berücksichtigung der dazugehörigen Kultur in den richtigen Zieltyp
umzuwandeln. Wenn dann das Cad-System Zeichenketten in invarianter Kultur
haben will, dann kann man diese tygerechten Variablen wieder in
Zeichketten umwandeln und dabei InvariantCulture nutzen.
Das ist Wunschdenken.;=)
--
Gruß Scotty
Peter Fleischer
2009-06-06 04:11:50 UTC
Permalink
Post by Kerem Gümrükcü
Post by Peter Fleischer
unter Berücksichtigung des MSB ist das wohl dasselbe:-) Ob ich das MSB
des Exponenten als Vorzeichen interpretiere und die Mantisse mit dem
unterdrückten MSB damit bewerte oder erst eine Bias-Berechnung durchführe
und dann das 1-Bit voranstelle, ergibt doch das gleiche Ergebnis.
Hallo Peter,
das ist es nicht. Du kannst für ein Formt auch ein Bias vorschreiben(bei
Temperaturangaben völlig normal)
Damit erhälts Du eine Unsymetrie im Darstellungsbereich. Ist absolut
legitim.
Hi Karsten,
wir reden hier über IEEE-754 und die Intel-Prozessorarchitektur, AutoCad und
Parameterübergabe. Wo ist da für lange Gleitkommazahlen ein anderer Bias
möglich?
Post by Kerem Gümrükcü
...
Post by Peter Fleischer
Post by Kerem Gümrükcü
String ist hier "pflegeleichter" sobald man sich auf den Dezimaltrenner
geeinigt hat.
Das meinst du wohl nicht im Ernst? Nicht typgerechte Arbeitsweise soll
"pflegeleichter" sein?
Du hast es nicht verstanden. :=(
Das habe ich wirklich nicht. Da ich viel mit AutoCad gearbeitet habe (zur
Erinnerung: Thema dieses von Hartmut initiierten threads), weiß ich nicht,
wo das ein Dezimaltrenner eine Bedeutung haben soll. Es gibt lediglich die
Festlegung, dass Schnittstellen (dxf), Literale in Programmtexten (VBA und
Lisp) und Eingaben im Direktfenster in der englischen Notation auszuführen
sind. Daher kommt auch Hartmuts Problem, im Programm oder im Direktfenster
Parameter anzugeben, z.B. Point(1.2,2.2,3.3).
Post by Kerem Gümrükcü
Post by Peter Fleischer
Post by Kerem Gümrükcü
Tausendertrenner können dann einfach ignoriert werden und die Wandlung
in den Zieldatentyp ist kein Problem mehr.
Wie stellst du dir die Ignorierung denn vor?
Und hier hast es auch nicht verstanden :=(
s. oben.
Post by Kerem Gümrükcü
Post by Peter Fleischer
Ein Anwender in der Schweiz gibt ein: 3'456,78
Das erschalge ich mit mit eine RagEx-Ausdruck und es gibt nichts mehr
außer dem Dezimaltrenner. Das Resultat wird versuch zu Parsen. Schlägt es
fehl...sorry da kann ich auch nichts zu.
Und warum nicht einfach ein Parse/TryParse und Weiterarbeit typgerecht?
Post by Kerem Gümrükcü
Post by Peter Fleischer
Solch ein "Ignorierungsalgorithmus" kann dann ganz schön kompliziert werden.
Quatsch!
Ohne eine konkrete Realisierung zu zeigen, entbehrt die Antwort jeder
Grundlage.
Post by Kerem Gümrükcü
Post by Peter Fleischer
Besser ist es, gleich typgerecht zu arbeiten
Ist aber nicht immer gegeben (siehe Gerber-Daten)
Das Gerber-Format ist eine Übergabe-Spezifikation, wo nur ganzzahlige
dezimale Werte als Zeichenketten übergeben werden. Mit einer in der
Formatbeschreibung definierten Skalierung bekommt der ganze Wert seine
Einheit. Eine Einheit kann damit beispielsweise 0,01 Zoll sein. Man kann
damit also die Angabe in eine Variable vom Typ Decimal verlustfrei
konvertieren.
Post by Kerem Gümrükcü
Post by Peter Fleischer
und eintreffende Zecihketten mit den Standardmitteln unter
Berücksichtigung der dazugehörigen Kultur in den richtigen Zieltyp
umzuwandeln. Wenn dann das Cad-System Zeichenketten in invarianter Kultur
haben will, dann kann man diese tygerechten Variablen wieder in
Zeichketten umwandeln und dabei InvariantCulture nutzen.
Das ist Wunschdenken.;=)
Vielleicht verräts du mal, bei welchem Cad-System das nicht so ist.

Bei AutoCad realisiert. Mit Gerber-Daten auch verlusfrei und problemlos
realisierbar. Andere Cad-System, mit denen ich zu tun hatte, hatten fast
alle eine dxf-Export-Schnittstelle und haben damit auch invariant ihre Daten
bereitgestellt.
--
Viele Grüsse
Peter
Peter Götz
2009-06-06 07:17:36 UTC
Permalink
Hallo Karsten,
Post by Karsten Sosna
Post by Peter Fleischer
Post by Kerem Gümrükcü
String ist hier "pflegeleichter" sobald man sich
auf den Dezimaltrenner geeinigt hat.
Bei international eingesetzten Anwendungen wäre das
fatal. Nur englischsprachige Anwender könnten Zahlen
in der ihnen gewohnten Schreibweise eingeben, alle
anderen müssten bei der Eingabe von Zahlen immer
von der gewohnten in die engl. (invariant) Schreibweise
umdenken, natürlich mit entsprechend hoher Fehler-
Wahrscheinlichkeit.
Post by Karsten Sosna
Post by Peter Fleischer
Das meinst du wohl nicht im Ernst? Nicht typgerechte Arbeitsweise soll
"pflegeleichter" sein?
Du hast es nicht verstanden. :=(
Einige von uns werden sich gewiss noch an das
Gezetere um das sog. Jahr-2000-Problem erinnern.
Dieses Problem wäre gar keines gewesen, wenn
man nicht auf die absurde Idee gekommen wäre,
Datums-/Zeitwerte als Strings sondern eben als das
was sie eigentlich sind, nämlich als numerische
Werte zu speichern und zu behandeln.
Post by Karsten Sosna
Post by Peter Fleischer
Ein Anwender in der Schweiz gibt ein: 3'456,78
Die Schweizer schreiben "3'456.78" (mit Punkt)
Post by Karsten Sosna
Das erschalge ich mit mit eine RagEx-Ausdruck
Einem Ausdruck, der das schweizerische Format erkennt?

Und warum nicht einfach
Dim strBuffer as String
Dim dblBuffer as Double
Dim C as Globalization.CultureInfo
Dim S As Globalization.NumberStyles

C = New Globalization.CultureInfo("de-CH")
S = Globalization.NumberStyles.Number

strBuffer = "3'3456.78"

if Double.TryParse strBuffer, S,C,dblBuffer) then
' Umwandlung ok
else
' Kein gültiger Ausdruck in strBuffer
end if


Und was tust Du, wenn die gleiche Anwendung auch
auf einem portugiesischen, einem französischen, einem
spanischen und auf einem englischen System laufen soll?

Da nehme ich dann aber schon lieber

dim strZahl as string = _
"Länderspezifisch formatierte Zahlendarstellung"

dim dblResult as double

if Double.TryParse(strZahl, dbResult) then
' umwandlung ok
else
' kein gültiger Ausdruck in strZahl
end if

weil eben der schweizerische Anwender auf seinem
schweizerischen System (de-CH) ebenso wie der
englische Anwender seine Zahlen in der ihm gewohnten
Schreibweise eingeben kann ohne gross über ein
möglicherweise irgendwo, irgendwann vereinbartes
Dezimal- oder sonstiges Trennzeichen nachdenken zu
müssen.
Post by Karsten Sosna
und es gibt nichts mehr außer
dem Dezimaltrenner.
Mit den passenden Umwandlungs- bzw. Parsefunktionen
gibt es weder Dezimaltrenner noch sonstige Trenner,
was mit schon deutlich übersichtlicher und weniger
fehlerträchtig erscheint.
Post by Karsten Sosna
Das Resultat wird versuch zu Parsen. Schlägt es
fehl...sorry da kann ich auch nichts zu.
Post by Peter Fleischer
Solch ein "Ignorierungsalgorithmus" kann dann
ganz schön kompliziert
werden.
Quatsch!
s.obige Parse - Beispiele, von denen
ich denke, dass sie kein Quatsch sind.
Post by Karsten Sosna
Post by Peter Fleischer
Besser ist es, gleich typgerecht zu arbeiten
Genau das, ohne wenn und aber.
Nur damit gibt es von vorneherein gar keine
Diskussionen über Dezimal- und sonstige Trennzeichen.
Post by Karsten Sosna
Ist aber nicht immer gegeben (siehe Gerber-Daten)
Post by Peter Fleischer
und eintreffende Zecihketten mit den Standardmitteln
unter Berücksichtigung der dazugehörigen Kultur in
den richtigen Zieltyp umzuwandeln. Wenn dann das
Cad-System Zeichenketten in invarianter Kultur
haben will, dann kann man diese tygerechten
Variablen wieder in Zeichketten umwandeln und
dabei InvariantCulture nutzen.
Das ist Wunschdenken.;=)
Warum ist das Wunschdenken.
Wo gibt es ein Problem einen String mit beliebigem
länderspezischen Format umzuwandeln in einen
numerischen Datentyp umzuwandeln

dim strBuffer as string = -
"Länderspez.formatierter Zahlenausdruck
dim dblResult as Double

dim C as CultureInfo = "jeweilige länderspez. CultureInfo)
dim S As NumberStyles = NumberStyles.Number

if Double.TryParse(strBuffer, s, C, dblResult then
...
else
...
end if

oder umgekehrt von einem numerischen Datentyp zu
einem Zahlenausdruck (String) mit einem beliebigen
länderspezifischen Format

strBuffer as String
dblValue as double = 3456.78

' für CurrentCulture
strBuffer = dblValue.ToString

' oder für beliebige Culture
Dim C As CultureInfo = _
New CultureInfo("entspr. Länderkennzeichen")

strBuffer = dblValue.ToString(C)

umzuwandeln?
Eben die Verwendung von CultureInfo bzw. von CurrentCulture
hat man sich ausgedacht um eine Anwendung unabhängig
von der beim Benutzer jeweils vorliegenden System-Länder-
Einstellung zu machen und dabei konsequent typgerecht
arbeiten zu können. Ich kann Peter Fleischer nur zustimmen,
typgerecht arbeiten und man erspart sich jede Menge
völlig überflüssiger Probleme.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Karsten Sosna
2009-06-06 10:15:05 UTC
Permalink
@All

Vorab, ich bin sicherlich kein Verfechter typengerechter Arbeitsweise! Ich
würde auch sehr gerne immer den passenden Typ an eine Routine übergeben
wollen in der Erwartung, das dieses auch berücksichtig wird. Leider ist das
aber nicht möglich oder wird ignoriert. Einfache sind alleine im
Graphics-Objekt wieder zu finden. Fast alle Überladungen zum Zeichnen können
auch mit Single-Werten aufgerufen werden, wobei sich jeder vorstellen könnte
das wohl kaum 0.57 Pixel gezeichnet werden können.
Gleiches gilt für Anwendungen die Parameter entgegennehmen(auch wenn sie Typ
String sind) und dann etwas tun, was ich ich nicht einsehen kann. VISIO ist
solch eine Anwendung alles was über 5 Dezimalstellen hinausgeht wird auf 4
Stellen gerundet. Single als Übergabeparameter würde also vollends
ausreichen, VISIO erwartet aber einen String und den nach allen Regel der
Kunst in der amerikanischen Schreibweise(ohne Tausendertrennen und nicht in
Exponentialschreibweise). Wenn dem immer so ist kann man dementsprechend
arbeiten.
Ich habe es ablegt, ständig Usereingaben so zu verändert das es wieder
passt. Mich interessiert das nicht mehr ob jeder eine Punkt oder ein Komma
als Dezimaltrenner ansieht. Wenn ich eine Zahl erwarte(als String) dann ist
der Dezimaltrenner ein Punkt und es gibt keine Tausendertrenner. Jegliche
Eingaben die nicht den Anforderungen entsprechen führen grundsätzlich zu
einem Abbruch. Diskussionsspielraum gibt es nicht mehr. Und wenn ich erwarte
das eine Zahl im Stringformat zu üdergeben ist bestimmte Regeln zu befolgen
hat, so ist das so. Ich habe bestimmt über 50 Terminalanwendungen
geschrieben. All diese Anwendungen haben feste Übergabeparameter die
eingehalten werden müssen. Dies ist zwingend notwendig damit ich sie ggf.
1:1 an andere Schnittstellen weitergeben muss.
Ich habe keinen Bedarf dann auch auf die Kultur zu achten, zumal das gar
nicht möglich ist. Der Punkt ist ein Dezimaltrenner, das Komma ein
Seperator, insofern bleibt hier kein Spielraum mehr. Diese Verfahren fahre
ich seit 1998 und habe keine Probleme damit.
--
Gruß Scotty
Thomas Scheidegger
2009-06-06 10:54:54 UTC
Permalink
Hallo Karsten,
...Graphics-Objekt wieder zu finden.
Fast alle Überladungen zum Zeichnen können auch mit Single-Werten
aufgerufen werden,
wobei sich jeder vorstellen könnte das wohl kaum 0.57 Pixel gezeichnet
werden können.
bei Graphics (GDI+) dürften da doch
die beliebigen Koordinatensysteme und ggf
Skalierungen/Transformationen usw der Grund sein!
Dass es (spätestens) auf dem Bildschirm keine halbe Pixels gibt
ist ein anderes Thema.
Und spätestens WPF arbeitet dann ja eh primär vektororientiert.
VISIO erwartet aber einen String
dann ist dies ein abschreckendes Beispiel,
nicht die Regel.
Wenn ich eine Zahl erwarte(als String) dann ist der Dezimaltrenner ein
Punkt und es gibt keine Tausendertrenner.
ja, diese Vorgabe hat durchaus seine Berechtigung,
ich verweise da immer auf eine (minimal-) Taschenrechner-Tastatur.
('echter' Taschenrechner, nicht der von MS Windows!)
Leider ist ausgerechnet bei (vollen) PC-Tastaturen
der rechte Zahlenblock oft 'lokalisiert', zB mit Komma :-(

IMHO entscheidend ist bei der Benutzereingabe,
dass Fehleingaben baldmöglichst gemeldet werden,
und akzeptierte Werte sofort von String in
den Ziel-Zahlentyp gewandelt werden.
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Peter Fleischer
2009-06-07 03:25:43 UTC
Permalink
Post by Karsten Sosna
Vorab, ich bin sicherlich kein Verfechter typengerechter Arbeitsweise! Ich
würde auch sehr gerne immer den passenden Typ an eine Routine übergeben
wollen in der Erwartung, das dieses auch berücksichtig wird. Leider ist
das aber nicht möglich oder wird ignoriert. Einfache sind alleine im
Graphics-Objekt wieder zu finden. Fast alle Überladungen zum Zeichnen
können auch mit Single-Werten aufgerufen werden, wobei sich jeder
vorstellen könnte das wohl kaum 0.57 Pixel gezeichnet werden können.
Hi Karsten,
schau dir mal WPF an:-)
Post by Karsten Sosna
Gleiches gilt für Anwendungen die Parameter entgegennehmen(auch wenn sie
Typ String sind) und dann etwas tun, was ich ich nicht einsehen kann.
VISIO ist solch eine Anwendung alles was über 5 Dezimalstellen hinausgeht
wird auf 4 Stellen gerundet. Single als Übergabeparameter würde also
vollends ausreichen, VISIO erwartet aber einen String und den nach allen
Regel der Kunst in der amerikanischen Schreibweise(ohne Tausendertrennen
und nicht in Exponentialschreibweise). Wenn dem immer so ist kann man
dementsprechend arbeiten.
Kannst du das mal konkret benennen? Ich habe AddIns für Visio geschrieben
und hatte an bisher keiner Stelle die Notwendigkeit, numerische, booleasche
und Datumswerte formatiert in invarianten Zeichenketten zu übergeben. Im
Gegenteil, wenn beispielsweise Daten aus Excel übernommen oder übergeben
werden, müssen diese bei deutschen Systemeinstellungen mit dem Komma als
Separator erstellt werden bzw. werden mit Komma als Separator
ausgegeben/angezeigt.
Post by Karsten Sosna
Ich habe es ablegt, ständig Usereingaben so zu verändert das es wieder
passt. Mich interessiert das nicht mehr ob jeder eine Punkt oder ein Komma
als Dezimaltrenner ansieht. Wenn ich eine Zahl erwarte(als String) dann
ist der Dezimaltrenner ein Punkt und es gibt keine Tausendertrenner.
Jegliche Eingaben die nicht den Anforderungen entsprechen führen
grundsätzlich zu einem Abbruch. Diskussionsspielraum gibt es nicht mehr.
Und wenn ich erwarte das eine Zahl im Stringformat zu üdergeben ist
bestimmte Regeln zu befolgen hat, so ist das so. Ich habe bestimmt über 50
Terminalanwendungen geschrieben. All diese Anwendungen haben feste
Übergabeparameter die eingehalten werden müssen. Dies ist zwingend
notwendig damit ich sie ggf. 1:1 an andere Schnittstellen weitergeben
muss.
Ich habe keinen Bedarf dann auch auf die Kultur zu achten, zumal das gar
nicht möglich ist. Der Punkt ist ein Dezimaltrenner, das Komma ein
Seperator, insofern bleibt hier kein Spielraum mehr. Diese Verfahren fahre
ich seit 1998 und habe keine Probleme damit.
Dazu hatte ich schon meine Meinung geschrieben - Usability nicht auf dem
Stand der Technik.
--
Viele Grüsse
Peter
Peter Götz
2009-06-07 06:43:45 UTC
Permalink
Hallo Karsten,
Post by Karsten Sosna
Vorab, ich bin sicherlich kein Verfechter typengerechter
Arbeitsweise!
Das "kein" im vorstehenden Satz sollte vermutlich ein
"ein" sein?
Post by Karsten Sosna
Ich würde auch sehr gerne immer den passenden Typ
an eine Routine übergeben wollen in
Ich sehe keinen Grund, das nicht zu tun.
Wird ein numerischer Datentyp erwartet, übergebe
ich einen solchen und wird ein String erwartet, dann
eben einen String.
Post by Karsten Sosna
der Erwartung, das dieses auch berücksichtig wird.
Von wem wird was nicht berücksichtigt.
Post by Karsten Sosna
Leider ist das aber nicht möglich oder wird ignoriert.
Warum ist was nicht möglich und von wem wird was
ignoriert?

Wenn ich eine Anwendung konzipiere, erstelle ich erst
mal ein durchdachtes Objektmodell und weiss dann
welche Eigenschaften dieser Objekte welche Daten-
typen erwarten bzw. welche Datentypen welche
Funktionen dieser Objekte liefern. Die Wahl der
Datentypen bei der Erstellung des/der Objektmodell/e
erfolgt passend zur gestellten Aufgabe. Ich sehe nicht,
was dabei nicht möglich sei oder von irgendjemandem
ignoriert würde.
Post by Karsten Sosna
Einfache sind alleine im Graphics-Objekt wieder zu finden.
Fast alle Überladungen zum Zeichnen können auch mit
Single-Werten aufgerufen werden, wobei sich jeder vorstellen
könnte das wohl kaum 0.57 Pixel gezeichnet werden können.
Ein Single muss ja nicht zwangsläufig eine gebrochene
Zahl darstellen.
Post by Karsten Sosna
Gleiches gilt für Anwendungen die Parameter entgegennehmen
(auch wenn sie Typ String sind) und dann etwas tun, was
ich ich nicht einsehen kann.
Schnittstellen zu Fremdprogrammen sind möglicherweise
nicht so umfassend dokumentiert, dass man den
Grund für den gewählten Datentyp nicht sofort erkennt.
Wobei ich nicht ausschliessen will, dass es eine
Menge Anwendungen gibt, die eben schlecht konzipiert
sind und tatsächlich mit eher untauglichen Datentypen
arbeiten. Typisches Beispiel war das Jahr-2000-Problem
in vielen Anwendungen, das nur deshalb entstand, weil
man Datumswerte als Strings gespeichert und verarbeitet
hatte.
Post by Karsten Sosna
VISIO ist solch eine Anwendung alles was über 5
Dezimalstellen hinausgeht wird auf 4 Stellen gerundet.
Ich kenne Visio zu wenig um darüber fundiert diskutieren
zu können. Aber das ändert nichts daran, dass ich in
eigenen Anwendungen darauf achte, konsequent typgerecht
zu arbeiten, und eben beim Erstellen der Objektmodelle
schon genau überlege, welcher Datentyp für welchen
Zweck der jeweils "zweckmässige" ist.
Post by Karsten Sosna
Single als Übergabeparameter würde also vollends
ausreichen, VISIO erwartet aber einen String und den
nach allen Regel der Kunst in der amerikanischen
Schreibweise(ohne Tausendertrennen und nicht in
Exponentialschreibweise). Wenn dem immer so ist
kann man dementsprechend arbeiten.
Natürlich werden sehr häufig Zahlendarstellungen in
Strings verpackt, wie z.B. bei XML und vielen anderen
Protokollen zum Datenaustausch, die textbasiert
arbeiten, das ist aber doch noch lange kein Grund
im eigenen Programmcode mit unpassenden Datentypen
zu arbeiten. Es gibt letztlich nur zwei Schnittstellen,
an denen von numerischen Datentypen zu Strings und
evtl. umgekehrt gewandelt werden muss. Das ist zum
einen die Schnittstelle Maschine - Mensch, der Mensch
gibt Zahlen in der im geläufigen länderspezifischen
Schreibweise über eine Tastatur ein, oder er liest sie
am Bildschirm oder auf Papier oder sonstigem
Medium ebenfalls wieder in der von ihm gewohnten
länderspezifischen Schreibweise. Die andere
Schnittstelle wäre dann eine zum Datenaustausch
mit anderen Maschinen (Maschine - Maschine).
Hier wird häufig, aus welchen Gründen auch immer,
textbasiert gearbeitet und man verwendet hierbei
gerne die invariante (englische) Formatierungsweise
für Zahlendarstellungen.

Ich sehe keinen vernünftigen Grund, beim Übergang
an der Schnittstelle Maschine - Mensch eine Umwandlung
von länderstpezifischem String in den jeweils aufgaben-
gerechten Datentyp bzw. umgekehrt vorzunehmen und
ebenso an der Schnittstelle Maschine - Maschine eben
von Strings mit invarianter (engl.) zum aufgabengerechten
Datentyp und umgekehrt zu wandeln.
Post by Karsten Sosna
Ich habe es ablegt, ständig Usereingaben so zu verändert
das es wieder passt.
Ich entwickle fast ausschliesslich für international
arbeitende Industrieunternehmen und da wird mir sowas
ganz selbstverständlich ins Pflichtenheft geschrieben.
Ich finde das auch ganz vernünftig und sehe darin nicht
das geringste Problem. Alle von mir genutzten
Programmiersprachen bieten einfachste Möglichkeiten,
Zahlendarstellungen beliebiger Formatierung in den
jeweils aufgabengerechten Datentyp und umgekehrt
num. Datentypen in entspr. formatierte Strings umzuwandeln.
Post by Karsten Sosna
Mich interessiert das nicht mehr ob jeder eine Punkt
oder ein Komma als Dezimaltrenner ansieht.
Na ja, wenn Dir ein Auftraggeber bestimmte Vorgaben
ins Pflichtenheft schreibt, solltest Du diese Vorgaben
tunlichst erfüllen, wenn Du hinterher nicht mächtigen
Ärger haben willst und in Folge dessen vermutlich
auch bald einen Kunden weniger.
Selbst ohne Vorgabe im Pflichtenheft ist es für mich
eine Selbstverständlichkeit, dem Benutzer einer
Anwendung die Möglichkeit zu geben, Zahlen in der
von ihm gewohnten länderspezifischen Schreibweise
eingeben bzw. lesen zu können. Der Programmier-
aufwand hierfür ist minimal und verbessert den Komfort
und die Sicherheit einer Anwendung ganz erheblich, ist
also ein nicht unwichtiges Qualitätsmerkmal.
Post by Karsten Sosna
Wenn ich eine Zahl erwarte(als String) dann ist
der Dezimaltrenner ein Punkt und es gibt keine
Tausendertrenner.
s.oben:
Pflichtenheft und Qualitätsmerkmale.
Oder wie man in Bayern sagt, "wer zahlt schafft an".
Post by Karsten Sosna
Jegliche Eingaben die nicht den Anforderungen
entsprechen führen grundsätzlich zu einem Abbruch.
Ein Programm, welches bei Fehleingaben einfach
abbricht, wird Dir vermutlich kein zahlender Kunde
abnehmen.
Post by Karsten Sosna
Diskussionsspielraum gibt es nicht mehr.
Den gibt es insofern nicht, als ein Pflichtenheft oder
eben ganz einfach allgmeine Qualitätsansprüche
definieren, wie eine Anwendung zu arbeiten hat.
Post by Karsten Sosna
Und wenn ich erwarte das eine Zahl im Stringformat
zu üdergeben ist bestimmte Regeln zu befolgen hat,
so ist das so.
Sorry, aber das ist schon recht blauäugig.
Der Auftraggeber oder eben ganz allgemein der
Kunde bestimmt, was eine Anwendung zu können
hat und wie sie zu arbeiten hat. Mit "ich mache das
so und nicht anders" würdest Du sehr schnell ohne
Kunden dastehen.
Post by Karsten Sosna
Ich habe bestimmt über 50 Terminalanwendungen
geschrieben. All diese Anwendungen haben feste
Übergabeparameter die eingehalten werden müssen.
Es spricht doch auch gar nichts dagegen, wenn
von einem Rechner zu einem nicht intelligenten
Terminal Daten textbasiert, mit einem bestimmten
vordefinierten Format übertragen werden, das muss
aber doch nicht dazu führen, dass man dem Anwender
zumutet, mit ihm ungewohnten Formatierungen bei
der Eingabe von Daten und beim Lesen von Daten
zu arbeiten oder auf der Rechnerseite mit unpassenden
Datentypen zu arbeiten.
Post by Karsten Sosna
Dies ist zwingend notwendig damit ich sie ggf.
1:1 an andere Schnittstellen weitergeben muss.
Wenn eine bestimmte Schnittstellenvereinbarung
für den Datenaustausch zwischen zwei Rechnern
oder sonstigen Endgeräten vereinbart ist, dann muss
man sich natürlich daran halten, aber auch das muss
nicht dazu führen, dass man den Anwender bei der
Dateneingabe und beim Lesen von Daten mit ungewohnten
Formatierungen traktiert und/oder Anwendungsintern
mit Strings arbeitet, wenn man eigentlich Zahlen, sprich
numerische Datentypen zu verarbeiten hat.
Post by Karsten Sosna
Ich habe keinen Bedarf dann auch auf die Kultur zu achten,
Mein Auftraggeber haben diesen Bedarf ausnahmslos
und ich hatte bisher kein Problem diese Forderung zu
erfüllen.
Post by Karsten Sosna
zumal das gar nicht möglich ist.
Was ist konkret nicht möglich?
Post by Karsten Sosna
Der Punkt ist ein Dezimaltrenner,
Nein, der Punkt ist ein Schriftzeichen wie jedes
andere auch, und ob er als Dezimaltrenner, als Satztrenner
oder was auch immer verwendet wird, ist eine rein
willkürliche Vereinbarung.
Post by Karsten Sosna
das Komma ein Seperator,
Was für den Punkt gilt, gilt ebenso für das Komma.
Post by Karsten Sosna
insofern bleibt hier kein Spielraum mehr.
Diese Verfahren fahre ich seit 1998 und habe
keine Probleme damit.
Nun, meine Erfahrungen mit international arbeitenden
Industrieunternehmen habe ich Dir ja bereits geschildert
und wie ich über Qualitätsstandards denke, dürfte
auch sichtbar geworden sein.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Peter Götz
2009-06-07 08:00:44 UTC
Permalink
Hallo Nochmal ,

Ich sehe keinen vernünftigen Grund, beim Übergang
an der Schnittstelle Maschine - Mensch eine Umwandlung
von länderstpezifischem String in den jeweils aufgaben-
gerechten Datentyp bzw. umgekehrt vorzunehmen und
ebenso an der Schnittstelle Maschine - Maschine eben
von Strings mit invarianter (engl.) zum aufgabengerechten
Datentyp und umgekehrt zu wandeln.

das muss natürlich heissen

Ich sehe keinen vernünftigen Grund, beim Übergang
an der Schnittstelle Maschine - Mensch eine Umwandlung
von länderstpezifischem String in den jeweils aufgaben-
gerechten Datentyp bzw. umgekehrt NICHT vorzunehmen und
ebenso NICHT an der Schnittstelle Maschine - Maschine eben
von Strings mit invarianter (engl.) zum aufgabengerechten
Datentyp und umgekehrt zu wandeln.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Thomas Scheidegger
2009-06-05 19:38:46 UTC
Permalink
Hallo Karsten
Post by Karsten Sosna
Meine Vermutung ist das Wertetypen
wie Double oder Single falsch interprtiert werden könnten,
da sie meist als Referenz übergeben werden.
in managed/safe .NET ist diese Fehlinterpretation 'unmöglich'.
In Visual C++ und COM unter Win32 geht es AFAIK eigentlich
auch immer um IEEE-754 kompatible Typen.
Da kann man wohl nur mit allgemein 'groben' Programmierfehlern
(falsche casts/pointer) etwas konstruieren.

Schlussendlich ist dann aber die FPU in Hardware massgebend,
(FloatingPoint per SW-Emulation meist 'tödlich' für Perf.)
welche bei intel (ua) 32/64/80-Bit breite Typen bietet,
natürlich IEEE-754 'konform'.
Fehlinterpretation inexistent, by design.

Solange es also um den Datenaustausch lokal
auf einem System geht
ist typgenau Double/Single problemlos und unbedingt zu bevorzugen.
Post by Karsten Sosna
String ist hier "pflegeleichter"
Strings höchstens für den generischen Datenaustausch
über 'Systemgrenzen' hinaus, etwa auf Basis XML oä.
Oder zur Visualisierung (GUI).

IMHO
ist heutzutage regelrecht eine String-Seuche ausgebrochen,
die Strafe dafür lautet: miese Performance garantiert;
Und eben nahezu immer Ursache solcher Probleme wie in diesem Thread.
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Kerem Gümrükcü
2009-06-05 20:05:14 UTC
Permalink
Hallo Thomas,
Post by Thomas Scheidegger
Schlussendlich ist dann aber die FPU in Hardware massgebend,
(FloatingPoint per SW-Emulation meist 'tödlich' für Perf.)
das ist noch untertrieben, da diese sog. Emulation besonders
bei breiteren Wörtern zu erheblichen Einbrüchen in der
Leistung führt,...
Post by Thomas Scheidegger
Post by Kerem Gümrükcü
String ist hier "pflegeleichter"
Strings höchstens für den generischen Datenaustausch
über 'Systemgrenzen' hinaus, etwa auf Basis XML oä.
Oder zur Visualisierung (GUI).
IMHO
ist heutzutage regelrecht eine String-Seuche ausgebrochen,
die Strafe dafür lautet: miese Performance garantiert;
Und eben nahezu immer Ursache solcher Probleme wie in diesem Thread.
Das aber lässt sich auch IMHO dadurch erklären, das Daten
vestärkt immer mehr als XML und vergleichbare textuelle
Formate gespeichert werden können. Wie ich schon sagte, ist
XML das beste Beispiel. Gäbe es solche Sachen nicht, dann würden
wir alles schon Binär ablegen und wieder einlesen. Ich gehe mal
nicht weiter darauf ein, aber der Mensch "neigt" zu einer vereinfachten
Handhabung, daher werden wir ja auch als "Gewohnheitstiere" bezeichnet.
Ich würde das nicht unbedingt als "Seuche" bezeichnen, eher als
eine natürliche Adaption und Integration unserer täglichen
Kommunikation. Der "String" bleibt unser Hauptmediator der
Information!

Grüße

Kerem
--
--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/software/deviceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
-----------------------
"This reply is provided as is, without warranty express or implied."
Post by Thomas Scheidegger
Hallo Karsten
Post by Kerem Gümrükcü
Meine Vermutung ist das Wertetypen
wie Double oder Single falsch interprtiert werden könnten,
da sie meist als Referenz übergeben werden.
in managed/safe .NET ist diese Fehlinterpretation 'unmöglich'.
In Visual C++ und COM unter Win32 geht es AFAIK eigentlich
auch immer um IEEE-754 kompatible Typen.
Da kann man wohl nur mit allgemein 'groben' Programmierfehlern
(falsche casts/pointer) etwas konstruieren.
Schlussendlich ist dann aber die FPU in Hardware massgebend,
(FloatingPoint per SW-Emulation meist 'tödlich' für Perf.)
welche bei intel (ua) 32/64/80-Bit breite Typen bietet,
natürlich IEEE-754 'konform'.
Fehlinterpretation inexistent, by design.
Solange es also um den Datenaustausch lokal
auf einem System geht
ist typgenau Double/Single problemlos und unbedingt zu bevorzugen.
Post by Kerem Gümrükcü
String ist hier "pflegeleichter"
Strings höchstens für den generischen Datenaustausch
über 'Systemgrenzen' hinaus, etwa auf Basis XML oä.
Oder zur Visualisierung (GUI).
IMHO
ist heutzutage regelrecht eine String-Seuche ausgebrochen,
die Strafe dafür lautet: miese Performance garantiert;
Und eben nahezu immer Ursache solcher Probleme wie in diesem Thread.
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Peter Krause
2009-06-05 08:03:50 UTC
Permalink
Hallo Peter,
das nächste Mal drücke ich mich genauer aus.
Wie bereits von Dir geschrieben, will ich die Werte an AutoCAD weitergeben.
AutoCAD will als Trennzeichen zu den Nachkommastellen einen Punkt, da das
Komma für das Trennen von x-, y- und z-Werten gebutzt wird.

Existiert z.B. für die x-Koordinate ein Double-Wert 32,76 dann muss dieser
vor der Weitergabe an AutoCAD in 32.76 geändert werden.
Würde man den wert nicht ändern, dann "spaltet" AutoCAD den Double-Wert
auf Grund des Kommas in einen x-Wert 32 und einen y-Wert 76.

Richtig ist auch, dass AutoCAD Double-Werte will und keinen String.
Bei einem String wäre es einfach das Komma durch einen Punkt zu ersetzen.
Bei einem Double-Wert kenne ich keine Lösung.
Hast Du einen Vorschlag?


Hartmut
Peter Fleischer
2009-06-05 08:35:31 UTC
Permalink
Post by Peter Krause
Wie bereits von Dir geschrieben, will ich die Werte an AutoCAD
weitergeben.
AutoCAD will als Trennzeichen zu den Nachkommastellen einen Punkt, da das
Komma für das Trennen von x-, y- und z-Werten gebutzt wird.
Hi Peter,
AutoCad will über die Objektautomatisierung typgerecht Parameterwerte vom
Typ Double. Da braucht man keinen Punkt und auch kein Komma.

Wenn du dxf-Dateien erzeugen willst, die dann in AutoCad eingelesen werden
sollen (DXF-Import), dann arbeite in VB.NET typgerecht und erzeuge die
dxf-Datei mit Invarianter Kultur.
Post by Peter Krause
Existiert z.B. für die x-Koordinate ein Double-Wert 32,76 dann muss dieser
vor der Weitergabe an AutoCAD in 32.76 geändert werden.
Was verstehst du unter Weitergabe? Arbeites du etwa mit SendKeys? Das würde
ich sofort überdenken.
Post by Peter Krause
Würde man den wert nicht ändern, dann "spaltet" AutoCAD den Double-Wert
auf Grund des Kommas in einen x-Wert 32 und einen y-Wert 76.
Ohne zu wissen, wie du arbeitest, kann man diese Aussage nicht bewerten.
Wenn du beispielsweise ein Punkt-Objekt erzeugen willst, so schreibst du
typgerecht die Koordinaten in ein Double mit 3 Elementen (x, y, z). Da
brauchst du keinen Punkt und auch kein Komma.
Post by Peter Krause
Richtig ist auch, dass AutoCAD Double-Werte will und keinen String.
Bei einem String wäre es einfach das Komma durch einen Punkt zu ersetzen.
Bei einem Double-Wert kenne ich keine Lösung.
Hast Du einen Vorschlag?
Z.B. so (über Objektautomatisierung):

Dim startPoint(2) As Double
Dim points(11) As Double
...
' Eingabe vom Bediener
Dim strHoch As String = "12,345"
' Umwandlung entsprechend lokalen Einstellungen
Dim hoch as Double = Double.Parse(strHoch)
...
' Arbeit mit typgerechten Werten
startPoint(0) = 0
startPoint(1) = 0
startPoint(2) = 0
blockObj = doc.Blocks.Add(startPoint, "Schacht")
points(0) = 0
points(1) = 0
points(2) = 0
points(3) = hoch * 10
points(4) = 0
points(5) = 0
points(6) = points(3)
points(7) = -hoch * 6.25
points(8) = 0
points(9) = 0
points(10) = points(7)
points(11) = 0
anObj = blockObj.AddPolyline(points)
...
--
Viele Grüsse
Peter
Johannes Busch
2009-06-05 08:02:50 UTC
Permalink
Post by Hartmut Callies
Hallo,
ich habe Double-Zahlen (kein String!); z.B. 34,6758
Von der Double-Zahl soll das Komma
durch einen Punkt ersetzt werden (34.6758).
Der Typ Double soll erhalten bleiben.
Wie kann das erreichen?
Grund: Der Wert wird an ein CAD-Programm übergeben.
Dieses kennt nur einen Punkt als Trennzeichen für Nachkommastellen.
Solche Probleme kenne ich massig. Das ist wohl ein us-Programm, gell?
Dann hilft Dir es am einfachsten, der ganzen Windows-Rechner auf us-en
laufen zu lassen. Wenn man nicht geht, dann kannst Du in Deinem Programm
für die Datenübergabe den eigenen Thread per
"System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo(??)" umschalten. Das "??" steht hier
für "Schau Dir das mal in der OH an"...

:-)
Johannes Busch
Loading...