2013-03-08 18 views
8

私のプログラムは、ポイントクラウドを名前空間の各ポイントクラウドがPoint3D[,]であるファイルに保存します。これは、(ポルトガル語)、出力ファイルの行を示していますC#でNaN文字列表現を変更するには?

-112,644088741971;71,796623005014;NaN (Não é um número) 

私はそれが(正確に後で解析されるために)ようにしたいと思いながら:

-112,644088741971;71,796623005014;NaN 

コードのブロックということ、

var lines = new List<string>(); 

for (int rows = 0; rows < malha.GetLength(0); rows++) { 
    for (int cols = 0; cols < malha.GetLength(1); cols++) { 

     double x = coordenadas_x[cols]; 
     double y = coordenadas_y[rows]; 
     double z; 

     if (SomeTest()) { 
      z = alglib.rbfcalc2(model, x, y); 
     } else { 
      z = double.NaN; 
     } 

     var p = new Point3D(x, y, z); 
     lines.Add(p.ToString());      

     malha[rows, cols] = p; 
    } 
} 

File.WriteAllLines("../../../../dummydata/malha.txt", lines); 

それはPoint3D.ToString()内部から呼び出されるdouble.NaN.ToString()方法、のように思える私は全く望んでいない「追加説明」を括弧ことが含まれます。ファイルを生成することはここにあります。

このメソッドを変更/オーバーライドして、括弧部分なしでNaNのみを出力する方法はありますか?

+2

NumberFormatInfo.NaNSymbol(http://msdn.microsoft.com/en-us/library/0c899ak8.aspxのノートセクション)をご覧ください。 – daniloquio

+0

@daniloquio提案?私は、私が探していたものだと確信しています! – heltonbiker

+0

解決済みの私の現在の答えを編集しました。どうぞご覧ください – daniloquio

答えて

11

Double.ToString()は、数字をフォーマットするためにNumberFormatInfo.CurrentInfoを使用します。この最後のプロパティは、現在アクティブなスレッドに設定されているCultureInfoを参照します。これは、デフォルトでユーザーの現在のロケールになります。この場合は、ポルトガルの文化の設定です。この現象を回避するには、Double.ToString(IFormatProvider)オーバーロードを使用してください。この場合、CultureInfo.InvariantCultureを使用できます。

さらに、他のすべてのマークアップを保持する場合は、NaNシンボルを切り替えることができます。デフォルトでは、グローバリゼーション情報は読み取り専用です。クローンを作成すると、これを回避できます。

System.Globalization.NumberFormatInfo numberFormatInfo = 
    (System.Globalization.NumberFormatInfo) System.Globalization.NumberFormatInfo.CurrentInfo.Clone(); 
numberFormatInfo.NaNSymbol = "NaN"; 

double num = double.NaN; 
string numString = System.Number.FormatDouble(num, null, numberFormatInfo); 

現在のスレッドでこれを設定するには、現在のカルチャのコピーを作成し、カルチャの数値書式情報を設定します。 Pre .NET 4.5すべてのスレッドに対して設定する方法はありません。各スレッドを作成したら、正しいCultureInfoを確保する必要があります。 .NET 4.5以降、AppDomain内のスレッドのデフォルトカルチャを定義するCultureInfo.DefaultThreadCurrentCultureがあります。この設定は、スレッドのカルチャがまだ設定されていない場合にのみ考慮されます(MSDNを参照)。シングルスレッドの

例:

System.Globalization.CultureInfo myCulture = 
    (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone(); 
myCulture.NumberFormat.NaNSymbol = "NaN"; 

System.Threading.Thread.CurrentThread.CurrentCulture = myCulture; 
string numString = double.NaN.ToString(); 
+1

これは、ローカライズされた小数点記号を使用して、希望の出力を生成しません。 –

+0

現在、 'NaN(nãoéumnúmero)'という文字列を取得しています。私の目標は 'NaN(数字ではない)'を得るのではなく、単純な 'NaN'だけを得ることです。どのように私はこれを得ることができますか? – heltonbiker

+0

Daniloquioのコメントによれば、 "NumberFormatInfo.NaNSymbol'プロパティがあります。" IEEE NaN(数値ではない)値を表す文字列を取得または設定します。 "ですから、私の質問は「現在のスレッドの文化のNaNSymbolを設定するにはどうすればいいの? – heltonbiker

1

は単にToStringにNaN値を渡しません。

例えば

(簡単に再利用のための拡張メソッドでラッピング):

についてどのように
static string ToCleanString(this double val) 
{ 
    if (double.IsNan(val)) return "NaN"; 
    return val.ToString(); 
} 
+0

自分のコードを更新しました。実際に 'double.NaN.ToString()'メソッドが 'Point3D.ToString()'メソッドの中から呼び出されています... – heltonbiker

+1

@heltonbiker:そうですね、それについて疑問に思いました。それは事を変えます。私の好みは 'Point3D.ToString()'呼び出しを、私のコントロール下の3つの値すべてを変換して連結する自分のメソッドで置き換えることだけであると思います。 –

0

NumberFormatInfo myFormatInfo = NumberFormatInfo.InvariantInfo; 

Point3D myPoint = new Point3D(1,1,double.NaN); 
var pointString = myPoint.ToString(myFormatInfo); 
+0

小数点の桁区切りが間違っています... –

0

まず、Caramirielが提供する答えはdouble.NaNが表さ持っているソリューションです。あなたが望むかもしれない文字列で

ところで、私は、文字列"NaN"をしたい、とここでthe docsの言うことには約NumberFormatInfo.NaNSymbol

IEEE NaN(非数)の値を表す文字列。 InvariantInfoのデフォルトは "NaN"です。

は、その後、私は私の希望純粋な「はNaN」の文字列を持つことが、現在のスレッドが作成された直後folloingラインを追加し、InvariantCultureInfoが提供するデフォルトを使用して、カンマ区切りを取り除く方法を考え出し

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; 

それはうまくいった!

関連する問題