如何更改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;