8

我的程序将点云保存到文件中,其中每个点云都是Point3D[,]来自System.Windows.Media.Media3D命名空间的 . 这显示了输出文件的一行(葡萄牙语):

-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);

似乎double.NaN.ToString()从 inside 调用的方法Point3D.ToString()包括我根本不想要的带括号的“附加解释”。

有没有办法改变/覆盖这个方法,使它只输出NaN,没有括号部分?

4

4 回答 4

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);

要在当前线程上设置它,请创建当前文化的副本并在文化上设置数字格式信息。在 .NET 4.5之前,无法为所有线程设置它。创建每个线程后,您必须确保正确的CultureInfo. 从 .NET 4.5 开始,CultureInfo.DefaultThreadCurrentCulture它定义了 .NET 中线程的默认区域性AppDomain。仅当尚未设置线程的文化时才考虑此设置(请参阅 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();
于 2013-03-08T18:51:33.430 回答
1

只是不要将 NaN 值传递给ToString.

例如(包装在扩展方法中以便于重用):

static string ToCleanString(this double val)
{
    if (double.IsNan(val)) return "NaN";
    return val.ToString();
}
于 2013-03-08T18:56:19.073 回答
0

怎么样:

NumberFormatInfo myFormatInfo = NumberFormatInfo.InvariantInfo;

Point3D myPoint = new Point3D(1,1,double.NaN);
var pointString = myPoint.ToString(myFormatInfo);
于 2013-03-08T19:10:24.237 回答
0

首先,Caramiriel 提供的答案是double.NaN用您可能想要的任何字符串表示的解决方案。

顺便说一句,我想要字符串"NaN",这是文档所说的NumberFormatInfo.NaNSymbol

表示 IEEE NaN(不是数字)值的字符串。InvariantInfo 的默认值为“NaN”。

然后我想出了如何获得我想要的纯“NaN”字符串并摆脱逗号分隔符,通过使用提供的默认值InvariantCultureInfo,在创建当前线程之后添加以下行:

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

效果很好!

于 2013-03-08T19:43:09.967 回答