Wie ändert man die NaN-Zeichenfolgendarstellung in C #?

8

Mein Programm speichert eine Punktwolke in einer Datei, wobei jede Punktwolke% Point3D[,] vom System.Windows.Media.Media3D -Namespace ist. Dies zeigt eine Zeile der Ausgabedatei (in Portugiesisch):

%Vor%

, während ich es gerne hätte (um danach richtig geparst zu werden):

%Vor%

Der Codeblock, der die Datei generiert, ist hier:

%Vor%

Es sieht so aus, als ob die double.NaN.ToString() -Methode, die von Point3D.ToString() aufgerufen wird, diese "zusätzliche Erklärung" in Klammern enthält, die ich gar nicht will.

Gibt es eine Möglichkeit, diese Methode zu ändern / zu überschreiben, so dass sie nur NaN ohne den Klammerteil ausgibt?

    
heltonbiker 08.03.2013, 18:46
quelle

4 Antworten

11

Double.ToString() verwendet NumberFormatInfo.CurrentInfo , um seine Zahlen zu formatieren. Diese letzte Eigenschaft verweist auf die CultureInfo , die derzeit im aktiven Thread festgelegt ist. Dies ist standardmäßig das aktuelle Gebietsschema des Benutzers. In diesem Fall ist es eine portugiesische Kulturumgebung. Verwenden Sie die Double.ToString(IFormatProvider) Überladung, um dieses Verhalten zu vermeiden. In diesem Fall könnten Sie CultureInfo.InvariantCulture verwenden.

Zusätzlich können Sie einfach das NaN-Symbol wechseln, wenn Sie alle anderen Markups beibehalten möchten. Standardmäßig sind Globalisierungsinformationen schreibgeschützt. Das Erstellen eines Klons wird dies umgehen.

%Vor%

Um dies für den aktuellen Thread festzulegen, erstellen Sie eine Kopie der aktuellen Kultur und legen Sie die Informationen zum Zahlenformat für die Kultur fest. Pre .NET 4.5 kann nicht festgelegt werden für alle Threads. Nachdem Sie jeden Thread erstellt haben, müssen Sie eine korrekte CultureInfo sicherstellen. Ab .NET 4.5 gibt es CultureInfo.DefaultThreadCurrentCulture , das die Standardkultur für Threads innerhalb von AppDomain definiert. Diese Einstellung wird nur berücksichtigt, wenn die Kultur des Threads noch nicht festgelegt wurde (siehe MSDN).

Beispiel für einen einzelnen Thread:

%Vor%     
Caramiriel 08.03.2013, 18:51
quelle
1

Übergeben Sie NaN-Werte einfach nicht an ToString .

Zum Beispiel (Umbruch in einer Erweiterungsmethode zur einfachen Wiederverwendung):

%Vor%     
Ben Voigt 08.03.2013 18:56
quelle
0

Wie wäre es mit:

%Vor%     
publicgk 08.03.2013 19:10
quelle
0

Zunächst ist die Antwort von Caramiriel die Lösung, die double.NaN durch eine beliebige Zeichenfolge repräsentiert, die Sie wünschen.

Übrigens, ich möchte die Zeichenfolge "NaN" , und hier ist was die Dokumente sagen über NumberFormatInfo.NaNSymbol :

  

Die Zeichenfolge, die den Wert IEEE NaN (keine Zahl) darstellt. Der Standardwert für InvariantInfo ist "NaN".

Dann habe ich herausgefunden, wie ich meinen gewünschten reinen "NaN" -String habe und entferne den Komma-Separator, indem ich die Vorgabe von InvariantCultureInfo benutze, füge die folgende Zeile hinzu, direkt nachdem der aktuelle Thread erstellt wurde:

%Vor%

Und das hat gut funktioniert!

    
heltonbiker 08.03.2013 19:43
quelle

Tags und Links