| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Falsches Tausendertrennzeichen bei String.Format() unter 2015 (1920 mal gelesen)
|
Gerundt Mitglied Administrator
Beiträge: 19 Registriert: 15.03.2005 AutoCAD Mechanical 2013 Autodesk Inventor 2013
|
erstellt am: 21. Nov. 2014 08:20 <-- editieren / zitieren --> Unities abgeben:
Ich habe ein AutoCAD-AddIn was bisher für ACADM 2013 benutzt wurde jetzt mal für ACADM 2015 kompiliert. Dabei ist mir leider aufgefallen, dass ich unter dem neuen AutoCAD ein falsches Tausendertrennzeichen habe (Komma anstatt Punkt). Die Ausgabe von folgendem VB-Quelltext gibt "1,234 Suchergebnisse" zurück: Code: Dim iCount As Integer = 1234Debug.Print(String.Format("{0:N2} Suchergebnisse", iCount))
Ich weiß mittlerweile, das "Globalization.CultureInfo.CurrentCulture" zwar auf Deutsch steht, das Tausendertrennzeichen "Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator" aber falsch ist. Wenn ich beim Initialisieren des AddIns den Wert auf "." setze, ist die Ausgabe wieder richtig: Code: Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator = "."
Ich weiß nur nicht, welche Auswirkungen das für AutoCAD hat?! Gibt es vielleicht ne AutoCAD-Option, wo ich das einstellen kann? Vielen Dank für eure Hilfe! [Diese Nachricht wurde von Gerundt am 02. Dez. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 25. Nov. 2014 11:53 <-- editieren / zitieren --> Unities abgeben: Nur für Gerundt
Hallo, welchen Einfluss das auf AutoCAD hat, kommt darauf an was du damit machst. Deine Variable iCount hat erst mal keine Tausender-Trennzeichen. Die kommen erst mit deiner Formatierung ({0:N0}) dabei wird der Wert von iCount in einen String gewandelt. Das ist dann wie Du schon festgestellt hast CulutureInfo abhängig. Bist Du Dir sicher das an Deinem Rechner das Zahlenformat richtig eingestellt ist(in der Systemsteuerung)? Meistens(leider nicht immer und überall) hält sich AutoCAD daran. Und weil wir gerade dabei sind: Einer Variable ohne Typ zu deklarieren war schon immer ein Garant dafür, dass mit dem Format später "irgendwas" nicht richtig stimmt. Gruss Holger [Diese Nachricht wurde von oscarr am 25. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gerundt Mitglied Administrator
Beiträge: 19 Registriert: 15.03.2005 AutoCAD Mechanical 2013 Autodesk Inventor 2013
|
erstellt am: 01. Dez. 2014 16:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, vielen Dank für dein Antwort! Leider habe ich keine Benachrichtigung bekommen und melde mich jetzt leider etwas verspätet. Das meine keine Variablen ohne Typ deklarieren soll stimmt natürlich. War jetzt auch nur beim Beispiel-Quelltext so. Im Original-Quelltext habe ich bei einem Objekt auf ein Integer-Property zugegriffen. Und auch beim Beispiel bringt "Dim iCount As Integer = 1234" leider keine Besserung. Das Zahlenformat von meinem Rechner ist richtig eingestellt und ich habe das Problem nur mit ACADM 2015. Der gleiche Quelltext unter ACADM 2013 läuft ohne Probleme. Viele Grüße, Tim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 02. Dez. 2014 12:53 <-- editieren / zitieren --> Unities abgeben: Nur für Gerundt
|
Gerundt Mitglied Administrator
Beiträge: 19 Registriert: 15.03.2005 AutoCAD Mechanical 2013 Autodesk Inventor 2013
|
erstellt am: 02. Dez. 2014 17:11 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, vielen Dank für deine Antwort und dem Link! Das Setzen der CultureInfo klappt gut und ist besser als sämtliche Einstellungen von Hand zurück zusetzen. Mir ist nämlich jetzt aufgefallen, dass auch NumberFormat.NumberDecimalSeparator falsch ist. Und wenn ein offizieller Autodesk-Blog beschreibt, wie man an die CultureInfo ändert, kann es AutoCAD ja nicht total schaden. Brauche also keine Angst haben, dass es explodiert. Der korrekte Beispiel-Quelltext wäre übrigens: Code: Dim iCount As Integer = 1234Debug.Print(String.Format("{0:N2} Suchergebnisse", iCount))
Da ich selber es mit einem Formular getestet habe, ist mir nicht sofort aufgefallen, dass Debug.Print("{0:N2} ...", iCount) anscheint nie die CurrentCulture verwendet. Werde jetzt eine Option in mein AddIn einbauen und abhängig davon beim Initialisieren die CultureInfo überschreiben. So kann ich es notfalls deaktivieren, wollten doch Probleme auftreten. Noch mal vielen Dank! Viele Grüße, Tim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Retail Ladenbau Spezialist (m/w/d) | SCHIESSER steht für Zeitgeist und Qualität, unsere Produkte für absolutes Wohlbefinden. Wir prägen und interpretieren den herrschenden Zeitgeist seit über 145 Jahren und übersetzen diesen in Wäsche für die ganze Familie. Natürlichkeit, Innovation, Qualität und Tradition sind die Grundpfeiler unserer Philosophie und bilden die Basis unseres täglichen Handelns. Wir bieten vielfältige Möglichkeiten, Deine Fähigkeiten und Talente einzusetzen und weiter zu entwickeln.... | Anzeige ansehen | Architektur |
|
Gerundt Mitglied Administrator
Beiträge: 19 Registriert: 15.03.2005 AutoCAD Mechanical 2013 Autodesk Inventor 2013
|
erstellt am: 17. Dez. 2014 09:10 <-- editieren / zitieren --> Unities abgeben:
Habe mir die Lösung aus dem AutoCAD DevBlog noch mal genauer angesehen, nach dem im offiziellen Autodesk-Forum gemahnt wurde, dass AutoCAD unter Umständen die Werte im Laufen Betrieb wieder zurück ändern könnte. Unter VB.net würde die Hilfsklasse so aussehen: Code: Imports System.Globalization Imports System.Threading''' <summary> ''' ... ''' </summary> ''' <remarks>http://adndevblog.typepad.com/autocad/2012/06/autocad-keeps-overriding-currentculture-and-currentuic... Public Class MyCultureOverride Private _PrevCulture As CultureInfo Private _PrevUICulture As CultureInfo Friend Shared ReadOnly CultureOverride As CultureInfo = CultureInfo.CreateSpecificCulture("de-DE") #Region "New" ''' <summary> ''' ... ''' </summary> Private Sub New() If CultureOverride IsNot Nothing Then _PrevCulture = Thread.CurrentThread.CurrentCulture _PrevUICulture = Thread.CurrentThread.CurrentUICulture Thread.CurrentThread.CurrentCulture = CultureOverride Thread.CurrentThread.CurrentUICulture = CultureOverride End If End Sub #End Region ''' <summary> ''' ... ''' </summary> Private Sub Restore() If _PrevCulture IsNot Nothing AndAlso _PrevUICulture IsNot Nothing Then Thread.CurrentThread.CurrentCulture = _PrevCulture Thread.CurrentThread.CurrentUICulture = _PrevUICulture End If End Sub ''' <summary> ''' ... ''' </summary> ''' <param name="useAction">Aktion</param> Public Shared Sub Use(useAction As Action) If useAction Is Nothing Then Throw New ArgumentNullException("useAction") End If Dim oCultureOverride = New MyCultureOverride() Try useAction() Finally oCultureOverride.Restore() End Try End Sub End Class
Testen kann man es mit folgendem Code: Code: <CommandMethod("MYTEST1")> _ Public Sub Test1Command() Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(String.Format("WITHOUT MyCultureOverride = {0:N2}", 1234)) End Sub<CommandMethod("MYTEST2")> _ Public Sub Test2Command() MyCultureOverride.Use(AddressOf Test2CommandAction) End Sub Private Sub Test2CommandAction() Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(String.Format("With MyCultureOverride = {0:N2}", 1234)) End Sub
Möglich, dass ich doch noch auf diese Variante umsteige. Mal sehen. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |