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 フィールドは、1 つの単精度浮動小数点数を指定します。MFFloat は、0 個以上の単精度浮動小数点数を指定します。SFFloats と MFFloats は、IEEE 1xxx 浮動小数点形式で VRML ファイルに書き込まれます ( 2.[IEEE]を参照)。

ハイパーリンクが指す場所に注意してください: ISO C の参考文献エントリへ。

そのため、カルチャ固有の書式設定 (特殊な小数点、それぞれ 3 桁のブロックを区切る文字など) を無効にするだけで、適切な書式が得られるはずです。これを行うには、「インバリアント カルチャ」を使用します。

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 に答える