Forum: PC-Programmierung Wie in C# String in Float umwandeln?


von Kill Blinton (Gast)


Lesenswert?

Hallo Leute


Wie kann ich einen String von dem ich nicht 100% sicher bin ob er eine 
Zahl (float) enthält in einen float umwandeln, ohne dass das Programm 
abstürzt, falls der String z.B. noch Buchstaben oder andere Zeichen 
enthält?


In Delphi gibt es z.B. die beiden Befehle.
_strToIntDef
_strToFloatDef


Wenn der String keine Zahl enthält kann ich einen definierten Wert 
angeben.




string strV1 = "B1.054";
float dblV2;
dblV = strV1.ToString();

So bekommt man sicher einen Programmabsturz.


Was ist die Alternative für dieses Problem?
Gruss

Kill Blinton

von bluppdidupp (Gast)


Lesenswert?


von Bibu (Gast)


Lesenswert?

Wenns geht, würde ich auf float verzichten und mich auf ZB auf 4 
Vorkomma 2 Nachkommastellen festlegen.

Du kannst den String Zeichen für Zeichen untersuchen. Tritt eine Zahl 
auf, speicherst du sie in einem Array (Ascii Offset abziehen - '0' bei 
jeder Zahl).

ZB im Array 0234.34 (das Komma nicht im Array)


0*100000 + 2*10000 # 3*1000 + 4 * 100 + 3 * 10 + 4 = ZB Zahl in long int 
Variabel abspeichern und auf Plausibilität testen.


Bibu

von bluppdidupp (Gast)


Lesenswert?

Erzeugt man ein Objekt dieser Klasse:
http://msdn.microsoft.com/de-de/library/system.globalization.numberformatinfo.aspx
...und füllt NumberDecimalSeparator etc. passend, kann man auch 
unabhängig von der Systemsprache Dezimaltrenner-Zeichen etc. angeben.
Das Objekt kann man dann bei .ToString(), .TryParse() etc. als 
zusätzlichen Parameter mitgeben...

von NurMalSo (Gast)


Lesenswert?

Ich würde ein Regex definieren und schauen ob der auf den String match.

von Kill Blinton (Gast)


Lesenswert?

Hallo

Ich werde mal versuchen was für mich die beste Lösung ist.

Danke für euere Hilfe



Gruss

Kill Blinton

von Markus V. (Gast)


Lesenswert?

NurMalSo schrieb:
> Ich würde ein Regex definieren und schauen ob der auf den String match.

Dann weisst Du erst mal nur, dass der String das richtige Format hat, 
umgewandelt ist er noch lange nicht.

bluppdidupp schrieb:
> http://msdn.microsoft.com/en-us/library/26sxas5t.aspx

Hier steht drin, wie es geht...

Gruß
MarkusM

von NurMalSo (Gast)


Lesenswert?

...nach dem positiven Match kann steht in dem Match-Ergebnis die Zahl 
als String drin, die man dann leicht umwandeln kann.

Dein TryParse benötigt die reine Zahl im String, also kein "B1.054" wie 
im Beispiel des Thread-Starters.

Also:
  1. mittels Regex den Zahlenstring extrahieren
  2. mit TryParse umwandeln

von bluppdidupp (Gast)


Lesenswert?

Ich bin davon ausgegangen das strToFloatDef() für "B1.054" ebenfalls 
fehlschlagen wird (kenne Delphi/Pascal nicht wirklich) und dann den 
Default-Wert zurückliefert.
Wenn dem nicht so ist, müsste man natürlich vorher filtern ;D

von Markus V. (Gast)


Lesenswert?

@NurMalSo:

Kill Blinton schrieb:
> Wenn der String keine Zahl enthält kann ich einen definierten Wert
> angeben.

Aufgrund der Anforderung ist der Ansatz mit der Regex Humbug. Die Frage 
ist, ob der KOMPLETTE String gültig ist, und nicht ob er IRGENDWO eine 
gültiges Fliesskomma-Literal enthält. Da man den mit Regex ermittelten 
String dann sowieso parsen muß, ist es sinnvoll, gleich TryParse zu 
verwenden und für den Fall, dass das Ergebnis false ist, den Defaultwert 
zu verwenden.
1
double d;
2
if ( double.TryParse( inputString,out d ) == false )
3
    d = defaultValue;

Gruß
Markus

von NurMalSo (Gast)


Lesenswert?

Sorry, hab mich von
> ...Wenn der String keine Zahl enthält...
blenden lassen.

Deine Aussage:
> "...Die Frage ist, ob der KOMPLETTE String gültig ist, und nicht
>  ob er IRGENDWO eine gültiges Fliesskomma-Literal enthält..."
führt dich aber auch ein bisschen ins weite Feld der Interpretationen.

von Markus V. (Gast)


Lesenswert?

NurMalSo schrieb:
> führt dich aber auch ein bisschen ins weite Feld der Interpretationen.

Wie immer, wenn es darum geht, Pflichtenhefte/Anforderungen 
umzusetzen... ;-)

Gruß
Markus

von Sven H. (dsb_sven)


Lesenswert?

Markus V. schrieb:
> NurMalSo schrieb:
>> führt dich aber auch ein bisschen ins weite Feld der Interpretationen.
>
> Wie immer, wenn es darum geht, Pflichtenhefte/Anforderungen
> umzusetzen... ;-)

Oder die Anforderungen nicht klar genug dargestellt sind...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.