tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列データのファイル書き込み
記事No8189
投稿日: 2008/09/19(Fri) 17:54
投稿者chime
配列データのファイル書き込みでstreamWriterを使って
次のようにCSV形式で書き出しています。ctotfai,stotfaiは定数。
For k = 0 To n1
            For l = 0 To n1
                svo = svohehx(k, l)
                Writer.WriteLine(CStr(ctotfai * svo) + "," + CStr(stotfai * svo))
            Next l
Next k
しかし、データ数値が小さい場合に0が沢山でます。シングルの指数E形式
に書き出したいのですが、いい方法があれば教えてくださいませ。

[ツリー表示へ]
タイトルRe: 自己Reです。配列データのファイル書き込み
記事No8194
投稿日: 2008/09/19(Fri) 20:19
投稿者chime
かなり少ない数値(−8乗程度)に対してはシングル指数になることは確認
しましたが、中途半端なものはそうはなりません。さて?

[ツリー表示へ]
タイトルRe: 配列データのファイル書き込み
記事No8195
投稿日: 2008/09/19(Fri) 20:29
投稿者魔界の仮面弁士
> しかし、データ数値が小さい場合に0が沢山でます。シングルの指数E形式
> に書き出したいのですが、いい方法があれば教えてくださいませ。

出力時に、数値の書式を指定してあげれば OK かと。

StreamWriter.WriteLine や、String.Fromat メソッド、
ToString メソッドなどには、引数に「書式」を
指定できるようになっていますので。


Dim d As Double = 任意の数値

Dim a As String = CStr(d)
Dim b As String = d.ToString()
Dim c As String = d.ToString("R")
Dim x As String = d.ToString("e")
Dim y As String = d.ToString("#,0.00000")
Dim z As String = d.ToString("0.0000E+0")

[ツリー表示へ]
タイトルRe^2: 配列データのファイル書き込み
記事No8196
投稿日: 2008/09/19(Fri) 22:47
投稿者chime
> StreamWriter.WriteLine や、String.Fromat メソッド、
> ToString メソッドなどには、引数に「書式」を
> 指定できるようになっていますので。

最初の疑問で書きましたが、二次元の配列データの出力でa,bと出したいのです。
WriteLineは文字列を引数としていると思っていますので、
Writer.WriteLine(CStr(ctotfai * svo) + "," + CStr(stotfai * svo))
として","をいれて全て文字にしたのです。
レスにある如く変数には型宣言をし、Option Strict On
で厳しく管理しています。

レスの如くではまだ上手くシングル指数で出力でいませんが?

[ツリー表示へ]
タイトルRe^3: 配列データのファイル書き込み
記事No8198
投稿日: 2008/09/21(Sun) 08:37
投稿者魔界の仮面弁士
> WriteLineは文字列を引数としていると思っていますので、
> Writer.WriteLine(CStr(ctotfai * svo) + "," + CStr(stotfai * svo))
> として","をいれて全て文字にしたのです。
なので、書式文字列を
 .WriteLine("{0:書式},{1:書式}", データ1, データ2)
のようにするなどして、カンマを含めて指定すれば良い事になりますね。
(StreamWriter.WriteLine や String.Format には、複数のデータを指定できます)


> レスの如くではまだ上手くシングル指数で出力でいませんが?
「常に指数書式」「データに応じて指数書式」「常に指数を使わない書式」などを
列記したのが先のサンプルです。

指数表記が目的ならば E 指定で良いと思いますが、指数部の桁数表記や
正数時の "+" 記号の有無なども指定したいのであれば、カスタム書式が便利かと。

その他、出力した文字列データを後から数値に戻す必要があるならば "R" 指定、
指数表記無しで小数部を固定桁数にするならば "F" 指定など、ご自身にとって
都合の良い書式文字列を探してみてください。


なお、正しい書式を指定しているはずなのに、求める結果が得られない場合には、
引き渡すデータ値(変数、定数、あるいは数式の演算結果など)の『型』が
間違っていないかどうかを確認してみてください。たとえば、データの型が
Long 型の場合、"g" 書式や "e" 書式は使えても、"r" 書式は使えません。


' ==== "g" 書式(データに依存した書式)の精度指定 ====
String.Format("{0:g}"  , 0.000001234)       ' → "1.234e-06"
String.Format("{0:g2}" , 0.000001234)       ' → "1.2e-06"
String.Format("{0:g15}", 0.000001234)       ' → "1.234e-06"
String.Format("{0:g}"  , 1.5)               ' → "1.5"
String.Format("{0:g2}" , 1.5)               ' → "1.5"
String.Format("{0:g15}", 1.5)               ' → "1.5"

' ==== "e" 書式(指数表現書式)の精度指定 ====
String.Format("{0:e}"  , 0.000001234)       ' → "1.234000e-006"
String.Format("{0:e2}" , 0.000001234)       ' → "1.23e-006"
String.Format("{0:e15}", 0.000001234)       ' → "1.234000000000000e-006"
String.Format("{0:e}"  , 1.5)               ' → "1.500000e+000"
String.Format("{0:e2}" , 1.5)               ' → "1.50e+000"
String.Format("{0:e15}", 1.5)               ' → "1.500000000000000e+000"

' ==== カスタム書式の例 ====
String.Format("{0:0.0000E0}" , 0.000001234) ' → "1.2340E-6"
String.Format("{0:0.0000E+0}", 0.000001234) ' → "1.2340E-6"
String.Format("{0:0.0000E0}" , 1.5        ) ' → "1.5000E0"
String.Format("{0:0.0000E+0}", 1.5        ) ' → "1.5000E+0"


----------------------------------------
《"R" 書式》《"r" 書式》
Single/Double型専用。R とは、round-trip の意味です。
文字列に変換した後、それを元の数値に戻す必要がある時に使われます。
「精度」を指定する事はできません(指定しても無視されます)が、
データの有効桁数が、Double 型なら 15 桁分、Single 型なら 7 桁分に
収まる場合は "G" 指定と同じ結果になります。それらの有効桁数を
超える場合には、Double は 17 桁、Single は 9 桁が使用されます。
なお 「"R" 書式」では、指数表記で出力される際に、指数部の区切りに
'E' の文字が利用されますが、「"r" 書式」では 'e' が利用されます。


《"G" 書式》《"g" 書式》
標準的な数値書式。G とは、general の意味です。
データに応じて、固定小数点表記または指数表記のいずれか簡潔な形式に変換されます。
「精度」の指定が無い場合、Single 型は 7、Double 型は 15、Decimal 型は 29 が
指定された物とみなされます。データの有効桁数が、それらの精度を超えていた場合、
超過した桁は丸められます。
なお 「"G" 書式」では、指数表記で出力される際に、指数部の区切りに
'E' の文字が利用されますが、「"g" 書式」では 'e' が利用されます。


《"E" 書式》《"e" 書式》
指数書式。E とは、(scientific) exponential の意味です。
数値は、"-d.ddd…E+ddd" または "-d.ddd…e+ddd" という形式の文字列に変換されます。
「精度」の指定は、小数部の桁数を示します(整数部は、常に 1 桁固定です)。
精度の指定が無い場合、小数部の桁数として既定の 6 桁が使用されます。
指数部は、常に "+" または "-" のいずれかと、3 桁以上の桁で構成されます。
(3 桁未満の場合、009 のように先頭にゼロが埋め込まれます)
なお 「"E" 書式」では、指数表記で出力される際に、指数部の区切りに
'E' の文字が利用されますが、「"e" 書式」では 'e' が利用されます。


細かく書くときりがないので、詳細はヘルプ等で御確認を。
http://msdn.microsoft.com/ja-jp/library/427bttx3.aspx

[ツリー表示へ]
タイトルRe^4: 配列データのファイル書き込み
記事No8210
投稿日: 2008/09/24(Wed) 15:43
投稿者chime
魔界の仮面弁士さん
レスありがとうございます。

> > Writer.WriteLine(CStr(ctotfai * svo) + "," + CStr(stotfai * svo))
> > として","をいれて全て文字にしたのです。
> なので、書式文字列を
>  .WriteLine("{0:書式},{1:書式}", データ1, データ2)

教えていただいた方法で

'Writer.WriteLine(CStr(CDbl(ctotfai * swo)) + "," + CStr(CDbl(stotfai * swo)))

Writer.WriteLine("{0:0.000000E+0}, {1:0.000000E+0}", (ctotfai * swo), (stotfai * swo))

と書き換えて、所望のE形式での小数点以下6桁で、配列がCSVで得られました。

完璧です。魔界の仮面弁士さんこれでVB6コードのVB2005移行が終わりに近づいてきました。 
ありがとうございます。

chime

[ツリー表示へ]