如何改变在C#中NaN的字符串表示?(How to change NaN string repres

2019-07-21 05:35发布

我的程序节省了点云到文件,其中每个点云是一个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()方法,从里面叫Point3D.ToString()包括括号中的“补充说明”这是我不希望的。

有没有办法来改变/重写此方法,让它只输出NaN ,没有括号的一部分?

Answer 1:

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它定义为内螺纹的默认区域性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();


Answer 2:

只要不传递NaN值到ToString

例如(在容易再利用的扩展方法包裹):

static string ToCleanString(this double val)
{
    if (double.IsNan(val)) return "NaN";
    return val.ToString();
}


Answer 3:

怎么样:

NumberFormatInfo myFormatInfo = NumberFormatInfo.InvariantInfo;

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


Answer 4:

首先,由Caramiriel提供的答案是有解决方案double.NaN由你可能希望任何字符串来表示。

顺便说一句,我希望字符串"NaN" ,这里就是该文档说的NumberFormatInfo.NaNSymbol

代表该IEEE NaN(非数字)值的字符串。 对于InvariantInfo的默认值为是“南”。

后来我想通了如何有我想要的纯粹“南”的字符串,摆脱逗号分隔的,通过使用提供的默认InvariantCultureInfo ,将创建当前线程刚过folloing行:

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

这工作得很好!



文章来源: How to change NaN string representation in C#?