Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: eknori am 01.06.15 - 09:53:52

Titel: Issue when converting Text to Number
Beitrag von: eknori am 01.06.15 - 09:53:52
Ich hätte da gerne mal ein Problem ...

Folgendes Szenario.

In einer Maske ist die Quota in einem Text Item gespeichert. der Wert dort ist "700.0"

LS Code liest den Wert aus und macht ein Cast nach Long zur Weiterverarbeitung.

Dummerweise kommt beim Cast immer 7000 raus. ( Egal, ob CInt, CLng oder CDbl )

Das führt natürlich zu lustigen Ergebnissen.

Man kann übrigens beliebig viele Punkte in den String einfügen; es kommt immer 7000 raus

Ist das wirklich richtig so? Oder ein Bug im LS?
Titel: Re: Issue when converting Text to Number
Beitrag von: Keydins am 01.06.15 - 10:04:54
Ändert sich das Verhalten, wenn man im Betriebssystem die engliche Interpunktion für Zahlen aktiviert? In good 'ol germany ist der '.' ja nur ein Marker für 1.000-Schritte und wird deshalb vielleicht beim Konvertieren ignoriert.

Gruß
Dirk
Titel: Re: Issue when converting Text to Number
Beitrag von: eknori am 01.06.15 - 10:14:28
Nein, keine Änderung. Wir haben das Verhalten auf unterschiedlichen Systemen mit unterschiedlichen Spracheinstellungen beobachtet
Titel: Re: Issue when converting Text to Number
Beitrag von: eknori am 01.06.15 - 10:18:07
Ersetzt man den Punkt durch ein Komma, dann funktioniert es. So ein Mist.
Titel: Re: Issue when converting Text to Number
Beitrag von: Tode am 01.06.15 - 10:23:12
Das ist eine wirklich hässliche Sache, über die ich auch schon gestolpert bin: LotusScript verwendet hier die Einstellungen aus dem Betriebssystem (und zwar unabhängig davon, was man in den Regional- Settings eingestellt hat.

Deutsches Betriebssystem = , als Dezimaltrennzeichen und . als Tausender- Trennzeichen (der ignoriert wird).

Du musst quasi den "richtigen" Dezimaltrenner reinrechnen. Dazu verwendest Du genau das beobachtete Verhalten als Indikator:

Code
Dim strNumber as String
Dim lngNumber as Long
strNumber = "100.0"
lngNumber = Clng( strNumber )
if lngNumber = 100 then '- Trennzeichen ist .
    strDecimal = "."
    strThousand = ","
Else
    strDecimal = ","
    strThousand = "."
End If

Wenn Du jetzt sicher bist, dass im Textfeld immer der Punkt verwendet wird,
dann musst Du ja nur sowas tun:

Code
If strDecimal = "," then
   '- falsche tausender- trennzeichen ersetzen
   strNumber = Replace( strNumber, "," , "" )
   '- falsches dezimal- trennzeichen ersetzen
   strNumber = Replace( strNumber, "." , "," )
End If

Ich weiss, dass Du den Code jederzeit selbst aus dem Ärmel schütteln könntest, ist nur für denjenigen, der hier mal auf der Suche nach einer Lösung vorbeistolpert...

Aber um Deine Frage zu beantworten: "Bug" würde ich das nicht nennen, eher "Works as Designed" auch wenn das bedeutet, dass der Code bei gleicher Datenlage auf zwei verschiedenen Maschinen völlig unterschiedliche Ergebnisse liefert...
Titel: Re: Issue when converting Text to Number
Beitrag von: eknori am 01.06.15 - 10:31:25
Danke, Thorsten.

habe es jetzt erst einmal so gelöst

Code
Function ConvertTextToNumber(szValue As String) As Integer
	ConvertTextToNumber = Cint(szValue)
	If Instr(szValue, ".") > 0 Then
		ConvertTextToNumber = Cint(Left( szValue, Instr(szValue, ".") - 1 ))
	End If
End Function

da es bei Komma Funktioniert und lediglich der Punkt Probleme bereitet.

Titel: Re: Issue when converting Text to Number
Beitrag von: Tode am 01.06.15 - 10:39:15
Wenn Dich nur der Integer- Part interessiert, dann ist das natürlich auch ausreichend...
Ach ja: Nur für die Akten:
Code
StrLeft( szValue, "." )
hätte auch gereicht statt Deines Instr- Konstrukts...
Titel: Re: Issue when converting Text to Number
Beitrag von: Thomas Schulte am 01.06.15 - 10:40:36
Das ist eine wirklich hässliche Sache, über die ich auch schon gestolpert bin: LotusScript verwendet hier die Einstellungen aus dem Betriebssystem (und zwar unabhängig davon, was man in den Regional- Settings eingestellt hat.
Ja über dieses Verhalten bin ich auch schon gestolpert.
Das Problem ist nur das es bei Code der auf Maschinen die mit unterschiedlichen OS Settings arbeiten (internationales Umfeld) nicht funktioniert. Dann muss man nämlich erst rausfinden wie die OS Settiings ausschauen um dann entsprechend zu verzweigen. Das ist hässlich.