DOBON.NET DOBON.NETプログラミング掲示板過去ログ

String.Formatについて

環境/言語:[WindowsXP C# VisualStudio2010]
分類:[.NET]

お世話になっています。

String.formatについて、このようなフォーマットの変更が可能かどうかについての質問です。

String.formatで文字列の整理をしているのですが、全角と半角が混じった文字列を整理すると、ずれてしまいます。

ソース
string.Format("{0:8}","111");
string.Format("{0:8}", "111");

表示(_は半角スペース)
_____111
_____111

これを、文字数で整列するのではなく、バイト数で整列する方法はないでしょうか?
もしくは、これに適したロジックなどないでしょうか?

よろしくお願いします。
  • 題名: Re[1]: String.Formatについて
  • 著者: Azulean
  • 日時: 2010/11/24 22:32:44
  • ID: 27639
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
何に対して表示しようと考えていますか?
Label コントロールの Text プロパティに設定するのか、TextBox コントロールの Text プロパティに設定するのか、Graphics.DrawString を利用するのか。
そういった用途によっては別の解決方法があるかもしれませんので、どういった使い方をしているか明示してください。

■No27629に返信(みさきさんの記事)
> これを、文字数で整列するのではなく、バイト数で整列する方法はないでしょうか?

余談ですが、.NET Framework での通常の文字列では、多くの文字を 2 バイトで表現します。
半角の 1 だろうが、全角の 1 だろうが、2 バイトで表現されています。
なので、「バイト数」でフォーマットできたとしても、半角の 1 と全角の 1 は同じ扱いにならないといけません。

多分、Shift_JIS でのバイト数表現のことを指されているのかもしれませんが、.NET Framework では Unicode(UTF-16)が基本となる点をご留意ください。
■No27629に返信(みさきさんの記事)

Azuleanさんの言うようにShift_JIS でのByte数ということであれば
enc = Encoding.GetEncoding("Shift-Jis")
でエンコーダを取得して
enc.GetBytes("111")とかenc.GetBytes("111")
がそれぞれShift_JIS としてのbyte配列を返すのでその長さで調整する
ような処理になるかと思います。Formatの書式では厳しいかなと思います。

印刷やイメージであれば、幅を指定して右寄せで出力すれば良いかと思います。
■No27639に返信(Azuleanさんの記事)
> 何に対して表示しようと考えていますか?

失礼いたしました。
iniファイル書き込み用に関数を作りそれを通して外部ファイルに出力させようとしています。

とりあえず、shuさんの言うGetBytesを使って考えてみます。
  • 題名: Re[3]: String.Formatについて
  • 著者: みさき
  • 日時: 2010/11/25 10:53:47
  • ID: 27643
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
GetByteCountでバイト数を調節することで実装することができました。
Azuleanさん、shuさんありがとうございました。
以下に完成した関数を残します。


objText: 対象テキスト
intBytes: バイト数
blnLeft: 右詰か左詰かの判定
public static string strFormat(object objText, int intBytes, bool blnLeft)
{
 string strText = "";
 int intText = 0;
 Encoding enc = Encoding.GetEncoding("Shift-Jis");
 intText = enc.GetByteCount(objText.ToString());

 if (blnLeft)
 {
  strText = objText.ToString();
  for (int intL1 = intText; intL1 < Bytes; intL1++)
   strText += " ";
 }
 else
 {
   for (int intL1 = intText; intL1 < Bytes; intL1++)
    strText += " ";
   strText += objText.ToString();
  }
  return strText;
}
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板