この場合の文字列変換を教えてください。

解決


hiro  2007-09-13 20:29:44  No: 99435

初めまして、hiroと申します。
数値を文字列に変換する方法を教えてください。
例えば1.01E+63というような大きな数値なのですが、
指数の形ではなく、"1010000…"とういう感じで文字列に変換したいのです。
理解が浅く説明がおかしいかも知れません。
どうかよろしくお願いいたします。


魔界の仮面弁士  2007-09-13 23:54:47  No: 99436

うーん。ゴリゴリと文字列処理するぐらいしか思いつかない……。

Public Function ToString(ByVal value As Double) As String
    Const FmtLen As Integer = 14
    
    Dim stNum As String
    stNum = "+0." & String(FmtLen, "0") & "E+000;-0."
    stNum = stNum & String(FmtLen, "0") & "E+000;"
    
    Dim ary() As String
    ary = Split(Format$(value, stNum), "E")

    Dim pos As Integer
    pos = CInt(ary(1))
    
    If pos = 0 Then
        ToString = ary(0)
    Else
        ary(0) = Replace(ary(0), ".", "")
        If pos > 0 Then
            If Len(ary(0)) - 2 < pos Then
                ary(0) = ary(0) & String(pos - Len(ary(0)) + 2, "0")
            End If
            ToString = Left(ary(0), pos + 2) & "." & Mid(ary(0), pos + 3)
        Else
            ToString = Left(ary(0), 1) & "0." & String(Abs(pos + 1), "0") & Mid(ary(0), 2)
        End If
    End If
    
    Do While Right(ToString, 1) = "0"
        ToString = Left(ToString, Len(ToString) - 1)
    Loop
    If Right(ToString, 1) = "." Then
        ToString = Left(ToString, Len(ToString) - 1)
    End If
    If Left(ToString, 1) = "+" Then
        ToString = Mid(ToString, 2)
    End If
End Function


ガッ  2007-09-14 11:00:39  No: 99437

うーん,VB6なら Format$(1.01E+63, "0") でそれっぽくできました
※限定的に可能だっただけかどうかは,調べてません悪しからず


魔界の仮面弁士  2007-09-14 11:32:54  No: 99438

>> ガッさん
それも考えたのですが、小数部を持つ値(1.01E-63 など)の時のことを
考慮した結果、あのようなゴリゴリのコードになってしまったのです。(^^;


とはいえ、対象となるデータが、小数部の無い
>>> 大きな数値なのですが
に限定されるなら、ガッさんの方法でも十分対応できそうですね。


……ん? もしかしたら、ガッさんの方法を使って、さらに小数部も
指定すれば良いのかな。実験実験。


Public Function ToString(ByVal value As Double) As String

    ToString = Format$(value, "0." & String(330, "0"))

    '小数部の末尾 0 を取り除く
    Do While Right(ToString, 1) = "0"
        ToString = Left(ToString, Len(ToString) - 1)
    Loop

    '末尾が小数点記号のみなら取り除く
    If Right(ToString, 1) = "." Then
        ToString = Left(ToString, Len(ToString) - 1)
    End If
End Function


……結果は NG でした。

1.01E-63 ぐらいなら大丈夫なのですが、1.25E-300 という値になると、
残念ながら、正しく変換されませんでした。

(先に提示したコードでは、1.25E-300 でも変換されたのですけれども)


hiro  2007-09-14 13:31:21  No: 99439

魔界の仮面弁士さん、ガッさん
勉強させていただきました。ご親切にありがとうございます。
このご恩は忘れません。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加