如何更改C#中的NaN字符串表示形式?

如何更改C#中的NaN字符串表示形式?,c#,.net,tostring,nan,C#,.net,Tostring,Nan,我的程序将点云保存到文件中,其中每个点云都是System.Windows.Media.Media3D命名空间中的Point3D[,]。显示输出文件的一行(葡萄牙语): 虽然我希望它是(为了以后正确解析): 生成文件的代码块如下所示: var lines = new List<string>(); for (int rows = 0; rows < malha.GetLength(0); rows++) { for (int cols = 0; cols < ma

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

虽然我希望它是(为了以后正确解析):

生成文件的代码块如下所示:

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);
var行=新列表();
for(int rows=0;rows
Point3D.ToString()
内部调用的
double.NaN.ToString()
方法似乎包含了我根本不想要的括号中的“附加解释”

是否有方法更改/重写此方法,使其仅输出
NaN
,而不输出括号部分?

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);
要在当前线程上设置此值,请创建当前区域性的副本,并在区域性上设置数字格式信息。没有办法为所有线程设置它。创建每个线程后,必须确保正确的
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();

只是不要将NaN值传递给
ToString

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

那么:

NumberFormatInfo myFormatInfo = NumberFormatInfo.InvariantInfo;

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

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

顺便提一下,我想要字符串
“NaN”
,下面是关于
NumberFormatInfo.NaNSymbol
的说明:

表示IEEE NaN(非数字)值的字符串。不变量信息的默认值为“NaN”

然后我想到了如何使用
InvariantCultureInfo
提供的默认值,在创建当前线程之后添加以下行,从而获得所需的纯“NaN”字符串并去掉逗号分隔符:

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

而且效果很好

看看NumberFormatInfo.NaNSymbol(notes部分位于)@daniloquio您认为您可以在建议中提供一个快速工作的代码吗?我很确定我在找什么!用解决方案编辑了我当前的答案。请看一看,这不会产生他想要的输出,它使用了一个本地化的十进制分隔符。目前我得到了字符串
NaN(nãoéum número)
。我的目标不是得到
NaN(不是数字)
,而是只得到普通的
NaN
。我怎么能得到这个?@heltonbiker:你想对整个程序进行全局更改,或者只是为了在这个循环中格式化
Point3D
?我将使用当前线程方法的区域性,但为了记录,我测试了
输出.Replace(System.Globalization.NumberFormatInfo.CurrentInfo.NaNSymbol,“NaN”)
而且效果很好。一个很好的快速肮脏的把戏+1编辑,对实施进行了一些小的修改。我对它进行了测试,可以说它很有魅力。我更新了我的代码。实际上,
double.NaN.ToString()
方法是从内部调用的
Point3D.ToString()
方法…@heltonbiker:是的,我想知道。它改变了一切。我认为我的首选方法是用我自己的方法替换
Point3D.ToString()
调用,该方法转换并连接我控制下的所有三个值。
static string ToCleanString(this double val)
{
    if (double.IsNan(val)) return "NaN";
    return val.ToString();
}
NumberFormatInfo myFormatInfo = NumberFormatInfo.InvariantInfo;

Point3D myPoint = new Point3D(1,1,double.NaN);
var pointString = myPoint.ToString(myFormatInfo);
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;