String.Format 空白文字で右詰めができない! | vicのブログ

vicのブログ

ツール系やソフト開発について書こうと思っています。
書き込み大歓迎です。
間違いとかもっといい方法とかあったらご指摘いただけるとありがたいです。
質問をいただいたら、記事をもっとわかりやすく変更します。

指定する書式 書式指定項目の記述例 出力例
幅指定で右詰め String.Format("{0, 4}", num) “ 1”
幅指定で左詰め String.Format("{0, -4}", num) “1 ”
0埋め String.Format("{0:D4}", num)
または
String.Format("{0:0000}", num)
“0001”
幅指定かつ0埋め String.Format("{0, 8:D4}", num) “ 0001”
数値の書式指定でよく使用される書式指定項目の記述例


元ネタ

http://www.atmarkit.co.jp/fdotnet/dotnettips/116formatint/formatint.html




XNA の SpriteFont で 表示テストを行った結果、


空白や文字の横幅によって表示位置が変化するため、右揃えの1の位の位置に合わせるのは、

文字幅を均等にする方法が必要


  • FontName

    開発するパソコンにあるTrueTypeフォントの名前を指定。
    Size フォントサイズをポイント単位で指定。
    Spacing 文字間のピクセル数を指定。
    UseKerning カーニングの利用
    Style フォントスタイル(Regular、Bold、Italic)を指定。
    UseKerning カーニングの指定(true or false)
    CharacterRegions 利用する文字範囲を指定。
    初期値の ~~は全ASCIIコード

  • Kerning かと思ったが、結局、空白でそろえるのはダメみたいだった。


    0埋め」 のみはうまくいった。


    あとの考え方として


    1.  xxx.Length で桁数をチェックしてそれにより描画位置をずらす・・・・下記ソースで成功


    2. グラフィックの文字を「0」~「9」まで用意して数値表示関数を作る・・・・フォントさえ良ければ見た目も良いし実質ユーザー視点ではこれが最良か!




    開き直って1の位の描画がずれても気にしないという考え方もある。



    以下は試行錯誤したが、スペース文字の空白文字の幅が微妙な幅だったので


    失敗したソースの1部


    赤文字 = 意図した座標に表示されず失敗

    青文字 = 意図した座標に表示できた



    <Size>32</Size> で32にしている


    protected override void Draw(GameTime gameTime)
    {
    GraphicsDevice.Clear(Color.CornflowerBlue);

    // TODO: Add your drawing code here

    Fc++;

    // スプライトバッチ開始
    spriteBatch.Begin();
    //文字の描画
    spriteBatch.DrawString(fontArial, "Game Over", new Vector2(0, 0), Color.White);
    string str;
    str = String.Format("{0:N0}", Fc );
    spriteBatch.DrawString(fontArial, str , new Vector2(0, 32*1), Color.White);
    str = String.Format("{0:000000} ", Fc );
    spriteBatch.DrawString(fontArial, str , new Vector2(0, 32*2), Color.White);

    str = String.Format("{0,-6}", Fc);
    spriteBatch.DrawString(fontArial, str, new Vector2(0, 32 * 3), Color.White);
    str = String.Format("{0, 6}", Fc);
    spriteBatch.DrawString(fontArial, str, new Vector2(0, 32 * 4), Color.White);
    str = "" + Fc; int length = str.Length;
    str = " ".Substring(0,(5 -length)*3 ) + str;
    spriteBatch.DrawString(fontArial, str, new Vector2(0, 32 * 5), Color.White);
    int zure = (6-length)*24;
    spriteBatch.DrawString(fontArial, ""+Fc, new Vector2(zure, 32 * 6), Color.White);

    // スプライトバッチ終了
    spriteBatch.End();

    base.Draw(gameTime);
    }