string.PadLeft()が誤動作する

huahi11115 100 評価のポイント
2024-03-04T02:52:33.3866667+00:00

数値65432を16進数に変換して、「0FF98」という結果を期待しています。

ところが、string.PadLeft()が期待通りの文字列長さを返しません。

この解決法(期待通りの結果になる方法)を教えて下さい。

' 文字列を右詰、更に0埋めして5桁にしたい

     Dim zeroChar As Char = Char.ConvertFromUtf32(&H30) '0' を入力している

     s = $"0000{65432:X}" '65432 は &hFF98

     'ここでs="0000FF98"  が入っている

     Dim s1 = s.PadLeft(5, zeroChar) '結果は "0000FF98" 5桁になっていない??

     '正常に動作する例

     Dim Text As String = "123"

     Dim text2 = Text.PadLeft(5, zeroChar) '"00123"
.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
30 件の質問
{count} 件の投票

承認済みの回答
  1. Benshi.Orator 141 評価のポイント MVP
    2024-03-09T01:52:39.9066667+00:00

    PadLeft は文字通り、詰め物を加える動作(pad)は行いますが、切り抜く動作は行いません。

    String.PadLeft メソッド の説明におきましても、『指定された文字数になるまで』左側に埋め込むとの記述がありますね。

    '"0000FF98" … 元が8文字であるため、既に5文字より長いために無加工で返される
    Dim s1 = "0000FF98".PadLeft(5, "0"c)
    
    '"000000FF98" … 元が8文字だったので、10桁になるまで2文字埋めて返される 
    Dim s2 = "0000FF98".PadLeft(10, "0"c)
    
    '"00000" … 元が0文字だったので、5桁になるまで5文字埋めて返される 
    Dim s3 = "".PadLeft(5, "0"c)
    
    '"" … 元の文字数と指定された桁数が等しいため、同じ内容の文字列が返される
    Dim s4 = "".PadLeft(0, "0"c)
    
    
    Dim x As Integer = 65432
    
    '"0000FF98" … 8桁の大文字16進数 
    Dim h1 = $"{x:X8}"   ' h1 = x.ToString("X8")
    
    '"0000ff98" … 8桁の小文字16進数 
    Dim h2 = $"{x:x8}"   ' h2 = x.ToString("x8")
    
    '"0FF98" … 5桁の大文字16進数 
    Dim h3 = $"{x:X5}"   ' h3 = x.ToString("X5")
    
    '"FF98" … 元値が既に3文字を超えている場合、3桁に切り出されるわけではない
    Dim h4 = $"{x:X3}"   ' h4 = x.ToString("X3")
    
    '"00FF98  " … 6桁HEXの末尾に空白2桁 (8桁幅に左寄せの6桁大文字16進数)
    Dim h5 = $"{x,-8:X6}"
    
    '"  00ff98" … 6桁hexの先頭に空白2桁 (8桁幅に右寄せの6桁小文字16進数)
    Dim h6 = $"{x,8:x6}"
    

    なお、PadLeft に渡した桁数が「元の文字列と同じ桁数」だった場合と「元文字列より少なかった桁数」の場合、得られる文字列の内容は同じですが、インスタンスという点で差異が生じます。

    Dim a = "xyz"   '3文字
    Dim b = a.PadLeft(2, "0"c)  '元の文字数を下回る桁数を指定
    Dim c = a.PadLeft(3, "0"c)  '元の文字列と等しい桁数を指定
    Dim d = a.PadLeft(4, "0"c)  '元の文字数を上回る桁数を指定
    

    上記を実行した場合、下記の結果になります。

    • 「If a = b Then」は True であり、「If a Is b Then」も True
    • 「If a = c Then」は True ですが、「If a Is c Then」は False
    • 「If a = d Then」は Falseであり、「If a Is d Then」も False
    1 人がこの回答が役に立ったと思いました。

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. huahi11115 100 評価のポイント
    2024-03-04T03:03:26.89+00:00

    string.PadLeft() のドキュメントにあった

    結果として生成される文字列の文字数。これは、元の文字数と、埋め込み文字がある場合はその数を加えた数に等しくなります。

    上の意味がよく理解できなかったのですが、

    s = $"{65432:X}" 

    と変更したら期待通りの動作が確認されました。

    自己解決と致します。

    0 件のコメント コメントはありません