3

VB関数をVB.NETに移植しようとしていますが、関数を正しく動作させて正しく更新することができません。

rFormat = Format(Format(Value, fmt), String$(Len(fmt), "@"))

問題はString$()、値の小数点を揃えるために使用される関数パラメーターにあるようです。これを適切に修正するにはどうすればよいですか、またはこれを達成する別の方法はありますか?

編集

以下は、私が抱えている問題を示すコンソールアプリケーションの例です。

Imports Microsoft.VisualBasic
Module Module1

Sub Main()
    Dim rFormat As String
    Dim fmt As String
    Dim value As Object

    fmt = "########.000"
    value = 12345.2451212
    'value = 12345
    '~~~~~~~~~~~~~~~~~~~~~

    'rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length, "@"c))
    'Console.WriteLine(rFormat) ' <<Not working prints all "@" for any value!>>>

    'rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length))
    'Console.WriteLine(rFormat) '<<Not working prints nothing>>

    'rFormat = (String.Format(value, fmt)).PadLeft(Len(fmt))
    'Console.WriteLine(rFormat) ' <<Not working prints the value 12345.2451212>>> should print>>>>> 12345.245
    'for integer values< works good>

    rFormat = String.Format("{0," + fmt.Length.ToString + "}", String.Format(value, fmt))
    Console.WriteLine(rFormat) ' <<Not working prints the value 12345.2451212>>> should print>>>>> 12345.245
    'for integer values< works good>


End Sub

End Module
4

3 に答える 3

3

2 番目のString$パラメーターで指定された文字を、最初のパラメーターで指定された回数繰り返すだけです。

たとえば、fmt が "9999" の場合、String$ コマンドは "@@@@" を生成します。

これを String.PadLeft メソッドに置き換えて、Microsoft.VisualBasic 名前空間の VB Format 関数を引き続き使用できます。

    rFormat = Microsoft.VisualBasic.Format(Microsoft.VisualBasic.Format(value, fmt), "".PadLeft(fmt.Length, "@"c))

編集:

質問の編集に基づいて、正しい形式のロジックは次のようになります。

    rFormat = String.Format("{0:" & fmt & "}", value)

多くの例と説明があるため、 String.Format のドキュメントを確認することは非常に役立ちます。

于 2012-08-05T00:57:27.170 に答える
1

結果が固定長になるようにパディングしたいようです。String.PadLeft メソッドまたはString.PadLeft(int32,char) メソッドを使用して rFormat をパディングするのはどうですか。

スペースの場合は次のようになります。

rFormat = (String.Format(value, fmt)).PadLeft(Len(fmt))

編集

少年はVB6のドキュメントをオンラインで見つけるのが難しいです。VB6 カスタム形式では、このフォーラムの投稿とこのSO の回答@に従って、文字列の正当化に関係しているようです。彼らはこのようなことを提案しています。

rFormat = String.Format("{0," + fmt.Length.ToString + "}", String.Format(value, fmt))

これはComposite Formatting Alignment Componentを使用しています

アライメント コンポーネント

オプションの配置コンポーネントは、フォーマットされた優先フィールド幅を示す符号付き整数です。整列の値がフォーマットされた文字列の長さよりも小さい場合、整列は無視され、フォーマットされた文字列の長さがフィールド幅として使用されます。フィールド内の書式設定されたデータは、配置が正の場合は右揃えになり、配置が負の場合は左揃えになります。パディングが必要な場合は、空白が使用されます。配置を指定する場合は、カンマが必要です。


更新された例で見られる主な問題は、オブジェクトを使用して Double. 値の宣言を Decimal に変更し、フォーマット関数を変更することで、機能させることができました。

Sub Main()
    Dim rFormat As String
    Dim fmt As String
    Dim value As Double

    fmt = "#######0.000"
    value = 12345.2451212



    rFormat = String.Format("{0," + fmt.Length.ToString + "}", value.ToString(fmt))
    Console.WriteLine(rFormat) 
    Console.ReadLine()
End Sub

ここに画像の説明を入力

于 2012-08-05T00:53:52.183 に答える
0

ではVBNet、次のこともできます。

Dim rFormat As String = String.Empty
Dim fmt As String = "########.000"
Dim value As Object = 12345.2451212

rFormat = (CDbl(value)).ToString(fmt)
于 2012-08-06T00:38:02.213 に答える