Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Falsches Tausendertrennzeichen bei String.Format() unter 2015

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von Gerundt an!   Senden Sie eine Private Message an Gerundt  Schreiben Sie einen Gästebucheintrag für Gerundt

Beiträge: 19
Registriert: 15.03.2005

AutoCAD Mechanical 2013
Autodesk Inventor 2013

erstellt am: 21. Nov. 2014 08:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 = 1234

Debug.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


Sehen Sie sich das Profil von oscarr an!   Senden Sie eine Private Message an oscarr  Schreiben Sie einen Gästebucheintrag für oscarr

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 25. Nov. 2014 11:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gerundt 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Gerundt an!   Senden Sie eine Private Message an Gerundt  Schreiben Sie einen Gästebucheintrag für Gerundt

Beiträge: 19
Registriert: 15.03.2005

AutoCAD Mechanical 2013
Autodesk Inventor 2013

erstellt am: 01. Dez. 2014 16:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von oscarr an!   Senden Sie eine Private Message an oscarr  Schreiben Sie einen Gästebucheintrag für oscarr

Beiträge: 198
Registriert: 02.10.2007

ACA 2012 - English Win 7/x64

erstellt am: 02. Dez. 2014 12:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gerundt 10 Unities + Antwort hilfreich

Das sauberste ist wohl vorher die CulturInfo nochmals zu setzen:
Code:
  System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("de-DE")

(falls du in Deutschland bist.)

Schau Dir das hier mal an:
AutoCAD keeps overriding CurrentCulture and CurrentUICultureDas finde ich persönlich eigentlich ziemlich viel Aufwand

es sollte aber eigentlich:

Code:
iCount.ToString("N0", System.Globalization.CultureInfo.CreateSpecificCulture("de-DE"))

genügen

LG
Holger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Gerundt
Mitglied
Administrator


Sehen Sie sich das Profil von Gerundt an!   Senden Sie eine Private Message an Gerundt  Schreiben Sie einen Gästebucheintrag für Gerundt

Beiträge: 19
Registriert: 15.03.2005

AutoCAD Mechanical 2013
Autodesk Inventor 2013

erstellt am: 02. Dez. 2014 17:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 = 1234

Debug.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 ansehenArchitektur
Gerundt
Mitglied
Administrator


Sehen Sie sich das Profil von Gerundt an!   Senden Sie eine Private Message an Gerundt  Schreiben Sie einen Gästebucheintrag für Gerundt

Beiträge: 19
Registriert: 15.03.2005

AutoCAD Mechanical 2013
Autodesk Inventor 2013

erstellt am: 17. Dez. 2014 09:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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/auto​cad-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.Edit​or.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.Edit​or.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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz