0

我正在尝试以 VRML 2.0 使用的格式从 c# 输出浮点数。

根据vrml 规范,这是

IEEE 1xxx 浮点格式的双精度浮点数(参见 2.[IEEE])。

[IEEE]:ISO/IEC 9899:1990 编程语言——C. http://www.iso.ch/isob/switch-engine-cate.pl?searchtype=refnumber&KEYWORDS=9899 (死链接)

  • 这种格式的正确字符串表示是什么?我很难找到参考。我找到了一些关于二进制表示的解释,但没有找到关于字符串表示的解释。
  • 如何根据这种格式配置 NumberFormatInfo 或 CultureInfo ?

澄清:

我想生成一个 vrml 文件,我需要知道如何确保

var myCultureInfo = CultureInfo.InvariantCulture;
myCultureInfo.NumberFormat = ....
StringWriter sw = new StringWriter(MyCultureInfo)
sw.Write(myDouble);

根据 vrml 规范,将产生一个 100% 的数字。

4

1 回答 1

2

我在某处看到 VRML 使用与 ISO C 相同的浮点数格式。甚至您提到的 VRML 规范页面也暗示了这一点:

SFFloat 字段指定一个单精度浮点数。MFFloat 指定零个或多个单精度浮点数。SFFloats 和 MFFloats 以 IEEE 1xxx 浮点格式写入 VRML 文件(参见2.[IEEE])。

请注意该超链接指向的位置:指向 ISO C 的参考书目条目。

因此,如果您只是禁用任何特定于文化的格式(例如特殊小数点、分隔三个数字块的字符等),您应该获得正确的格式。您可以通过使用“不变文化”来做到这一点:

double number = …;
string numberEncoding = number.ToString(CultureInfo.InvariantCulture.NumberFormat);

如果要控制数字的输出格式,另请参阅标准数字格式字符串,例如

  • 对于科学格式:

    number.ToString("E", CultureInfo.InvariantCulture.NumberFormat)
    
  • 对于往返格式:

    number.ToString("R", CultureInfo.InvariantCulture.NumberFormat)
    

…等等。

PS:如果您不太相信不变的文化将是完全正确的匹配,您总是可以创建自己的实例NumberFormatInfo

var vrmlNumberFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", … };
string numberEncoding = number.ToString(vrmlNumberFormat);
于 2012-08-20T09:27:32.337 回答