C# 数値/文字列


算術演算 (演算子) ☆ 演算子 テスター
// 演算子による算術演算 ( 参照:演算子の優先順位 )

int N ;

N = 5 + 3 ;    //  8 (加算)
N = 5 - 3 ;    //  2 (減算)
N = 5 * 3 ;    // 15 (乗算)
N = 5 / 3 ;    //  1 (除算)

N = 5 % 3 ;    //  2 (剰余)

N = 5 ;
N ++  ;        //  6 (インクリメント)

N = 5 ;
N --  ;        //  4 (デクリメント)

算術演算 (関数)
// 関数による算術演算

int N ;

N = Math.Abs (-12)  ;       //  12 (絶対値)
N = Math.Sign(-12)  ;       //  -1 (符号)正数なら 1、ゼロなら 0、負数なら -1

N = Math.Max(12, 34) ;      //  34 (大きい方)
N = Math.Min(12, 34) ;      //  12 (小さい方)

double X ;

X = Math.Sqrt (2)     ;     //   1.414...(平方根)
X = Math.Pow  (2, 6)  ;     //  64       (累乗)
X = Math.Log  (12345) ;     //   9.421...(基数 eの対数)
X = Math.Log10(12345) ;     //   4.091...(基数10の対数)

算術演算での例外発生 ☆ 演算子 テスター
// 整数型      の場合、0 での除算はできない → 例外が発生する!
// 浮動小数点型の場合、0 での除算はできる   → 結果は「無限大」の定数!

int L ;
int M = 3 ;
int N = 0 ;

L = M / N ;  // 例外が発生!

擬似乱数
// Random(擬似乱数ジェネレータ) を使って、ランダムに点描する



配置 Button ;

private void button1_Click(object sender, System.EventArgs e)
{
    Invalidate() ;  // Paint ハンドラの起動 → ここでは "Form1_Paint()"
}

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    Graphics grfx = e.Graphics ;
    int X_max = this.ClientSize.Width  -  1 ;
    int Y_max = this.ClientSize.Height - 50 ;
    grfx.FillRectangle(new SolidBrush(Color.Black), 0, 0, X_max + 1, Y_max + 1) ;

    Random rand = new Random() ;  // 時間に応じて決まるシード値で初期化
    for (int N = 1 ; N <= 1000 ; N ++)
    {
        grfx.FillRectangle(
            new SolidBrush(Color.Yellow),
            rand.Next(X_max),  // 0 以上で X_max より小さい乱数(整数)
            rand.Next(Y_max),  // 0 以上で Y_max より小さい乱数(整数)
            2, 2) ;
    }
}

// Note: double 型の乱数は NextDouble() を使う。0 以上で 1 未満の値を返す。

小数点以下の四捨五入
string A ;
double X, Y ;

// 四捨五入する(数値 → 数値)

X = 12.50
Y = (int)(X + 0.5) ;        //  13

// 四捨五入する(数値 → 文字列) ☆ 書式指定 テスター X = 12.50 ; A = X.ToString("f0") ; // "13"("f0" の "0" は、小数点以下の桁数指定)
// 自分に最も近い整数を求める(丸め) // 四捨五入と似ているが、.5 の場合は、偶数になるように丸める X = Math.Round(12.49) ; // 12 X = Math.Round(12.50) ; // 12(四捨五入と異なる!) X = Math.Round(12.51) ; // 13 X = Math.Round(13.49) ; // 13 X = Math.Round(13.50) ; // 14 X = Math.Round(13.51) ; // 14

小数点以下の切り捨て
double X, Y ;

// 小数点以下を切り捨てる

X = 12.51
Y = (int)X ;                //  12

// 自分以下の整数を求める X = Math.Floor ( 12.34) ; // 12 X = Math.Floor (-12.34) ; // -13
// 自分以上の整数を求める X = Math.Ceiling( 12.34) ; // 13 X = Math.Ceiling(-12.34) ; // -12

型変換による精度保持
// 整数での算術演算の場合、精度の高い型に変換(キャスト)して演算する

int    M = 5 ;
int    N = 3 ;

double X = M / N ;                  // 1        (小数点以下の情報が失われる)
double X = (double)(M / N) ;        // 1        (小数点以下の情報が失われる)
double X = (double)M / (double)N ;  // 1.666... (OK!)

型変換によらない精度保持
// 整数での算術演算の場合、演算の順番に注意する → 除算は最後に行う!

int L =  2 ;
int M =  4 ;
int N =  6 ;

int J = L / M * N ;  // 0(NG:除算を先に行ってはダメ)
int K = L * N / M ;  // 3(OK:乗算を先に行う)

// Note: 乗算と除算は、演算の優先順位が同じなので、上記の場合、左から順に
//       評価(計算)される。

型変換の悪い例
// 精度の低い型への暗黙的変換は行えない

long  L = 123456 ;
int   M ;
int   N ;

M =      L ;  // コンパイルエラーが発生!(精度の低い型への暗黙的変換)
N = (int)L ;  // コンパイル OK!       (精度の低い型への明示的変換)

// 精度の低い型への明示的変換でも注意が必要 long L = 123456789012 ; int N ; N = (int)L ; // -1097262572(int の表現範囲値を超えているので変な結果になる!)

内部変換誤差の蓄積
// 0.0001 を 10000 回 加算すると、ぴったり 1 になるか? → 浮動小数点ではNG!

float   X = 0 ;  // 32 bit 浮動小数点 型(有効桁 約  7 桁)
double  Y = 0 ;  // 64 bit 浮動小数点 型(有効桁 約 16 桁)
decimal Z = 0 ;  // 固定小数点 型       (有効桁 約 29 桁)

for (int N = 1 ; N <= 10000 ; N ++)
{
    X += 0.0001f ;  // 結果 1.000054
    Y += 0.0001  ;  // 結果 0.999999999999906
    Z += 0.0001m ;  // 結果 1
}

// Note: decimal型では内部変換誤差は発生しないが、浮動小数点型では内部変換誤差が
//       発生することがあるので、注意すること!

数値を10進数文字列に変換 ☆ 書式指定 テスター
// 数値を、10進数の文字列に変換する (ToString メソッドを使う)

int    N ;
double X ;
string A ;

N = 123 ;
A = N.ToString()     ;  // "123"

X = 123.456789 ;
A = X.ToString()     ;  // "123.456789"
A = X.ToString("f2") ;  // "123.46"   (小数点以下2桁に四捨五入)

// Note: ToString() の引数は、書式指定(数値)を参照。

// 数値を、10進数の文字列に変換する (文字列の連結による自動変換を利用する) int N ; double X ; string A ; N = 123 ; A = "" + N ; // "123" X = 123.456789 ; A = "" + X ; // "123.456789" // Note: 二項演算子 + は、どちらかのオペランドが string 型の場合、文字列の連結を // 行う。文字列でないオペランドは、仮想の ToString() メソッドで変換される。

数値を16進数文字列に変換 ☆ 書式指定 テスター
// 数値(整数型)を、16進数の文字列に変換する

int    N ;
string A ;

N = 123 ;
A = N.ToString("x")  ;  // "7b"  (小文字で表示)
A = N.ToString("X")  ;  // "7B"  (大文字で表示)
A = N.ToString("x3") ;  // "07b" (小文字、3桁で表示)

N = 12345 ;
A = N.ToString("x3") ;  // "3039"

N = -1 ;
A = N.ToString("x")  ;  // "ffffffff"
A = N.ToString("x3") ;  // "ffffffff"

// Note: ToString() の引数は、書式指定(数値)を参照。

数値を2進数文字列に変換
// int 型を 2進数文字列に変換する(Convert クラスのメソッドを使う)

int    N ;
string A ;

N = 123 ;
A = Convert.ToString(N, 2) ;  // "1111011"

N = 123 ;
A = Convert.ToString(N, 2).PadLeft(32, '0') ;  // 常に32桁に変換
                              // "00000000000000000000000001111011"
N = -1 ;
A = Convert.ToString(N, 2) ;  // "11111111111111111111111111111111"

// int 型を 2進数文字列に変換する(自作コード) ; 結果は常に32桁 string int2bin(int x) { string A = "" ; for (int N = 0 ; N < 32 ; N ++) { A = (((x & 1) == 0) ? '0' : '1') + A ; x >>= 1 ; } return A ; } A = int2bin(123) ; // "00000000000000000000000001111011"

10進数文字列を数値に変換
// 10進数の文字列を、数値に変換する

int    N ;
double X ;
string A ;

A = "123" ;
N = int.Parse(A)    ;  // 123

A = "-123" ;
N = int.Parse(A)    ;  // -123

A = "123.456789" ;
X = double.Parse(B) ;  // 123.456789

A = "1.23e+005" ;
X = double.Parse(B) ;  // 123000

// Note: Parse() の引数が不適切な場合、例外が発生する!

16進数文字列を数値に変換
// 16進数文字列を int 型に変換する(Convert クラスのメソッドを使う)

string A ;
int    N ;

A = "9a" ;
N = Convert.ToInt32(A, 16) ;  // 154

A = "0x9A" ;
N = Convert.ToInt32(A, 16) ;  // 154 ; 先頭に"0x"があっても可、a〜fは大文字でも可

A = "0xffffffff" ;
N = Convert.ToInt32(A, 16) ;  //  -1 ; 結果は 32bit の int型

// Note: 文字列の先頭がマイナス記号'-'の場合、例外が発生する。

// Note: 9桁以上は OverflowException 例外が発生する! Convert.ToInt64 を使用せよ。

// 16進数文字列を int 型に変換する(自作コード) int hex2int(string x) { x = x.ToLower() ; if (x.IndexOf("0x") == 0) x = x.Substring(2) ; int M = 0 ; string A = "0123456789abcdef" ; for (int N = 0 ; N < x.Length ; N ++) { M = M * 16 + A.IndexOf(x[N]) ; } return M ; } int N = hex2int("9a") ; // 154

2進数文字列を数値に変換
// 2進数文字列を int 型に変換する(Convert クラスのメソッドを使う)

string A ;
int    N ;

A = "1001" ;
N = Convert.ToInt32(A, 2) ;  // 9

A = "11111111111111111111111111111111" ;
N = Convert.ToInt32(A, 2) ;  // -1(結果は 32bit の int型)

// 2進数文字列を int 型に変換する(自作コード) int bin2int(string x) { int M = 0 ; for (int N = 0 ; N < x.Length ; N ++) { M = M * 2 + ((x[N] == '0') ? 0 : 1) ; } return M ; } int N = bin2int("1001") ; // 9

数値を右詰めにする
// 数値を「右詰め」の文字列に変換する

string A ;
int    X = 1234 ;

A = String.Format("{0, 6}", X) ;      // "  1234"   6桁詰め
A = String.Format("{0,-6}", X) ;      // "1234  "   6桁詰め

A = String.Format("{0, 3}", X) ;      // "1234"     3桁幅 右詰め 桁数オーバーの例
A = String.Format("{0,-3}", X) ;      // "1234"     3桁幅 左詰め 桁数オーバーの例

A = String.Format("{0, 8:d}" , X) ;   // "    1234" 8桁幅 右詰め 10進数
A = String.Format("{0, 8:d6}", X) ;   // "  001234" 8桁幅 右詰め 10進数6桁
A = String.Format("{0, 8:x}" , X) ;   // "     4d2" 8桁幅 右詰め 16進数
A = String.Format("{0, 8:X}" , X) ;   // "     4D2" 8桁幅 右詰め 16進数(英大文字)
A = String.Format("{0, 8:x6}", X) ;   // "  0004d2" 8桁幅 右詰め 16進数6桁

// Note: String.Format() の詳細は、objectを文字列へ変換(3) を参照。

object を文字列へ変換
// object を文字列へ変換する各種方法

(1) 指定した object を、それと等価な String 形式に変換(書式指定可)

    object.ToString([format])

(2) 指定した object を、それと等価な String 形式に変換

    Convert.ToString(object)

    Note: このメソッドは、object.ToString() と、同じ機能である。
          ただし、object.ToString() では、「マーシャリング」関係で、コンパイル
          エラーが発生する場合があるので、その時は、こちらを使うとよい。

(3) 指定した object(複数可)を、書式指定に従って、等価な String 形式に変換

    String.Format(formats, object0[, object1[, object2[, ...]]])

    formats: { N [, M ][: format ]} 形式を含む、書式指定の文字列。
             N は、オブジェクト番号を示す 0 から始まる整数。 
             M は、値の幅(桁数)を指定する整数。余白部分は空白で埋められる。
             M が負の場合、値は左詰め、正の場合、値は右詰めになる。

    例: String.Format("{0} {1}", 123, 257)  →  "123 257"
    例: String.Format("#{0,4:D}#{1,4:X}#", 123, 257)  →  "# 123# 101#"
// Note: format は、 書式指定(数値), 書式指定(日付と時刻), 書式指定 テスター
//    を参照。

文字列で「\」文字を扱う
// 「\」文字は、エスケープシーケンスを示す記号なので、文字列に、それ「そのもの」
//  を含めて設定する時は、下記のいずれかのように記述する。

string file_name = "C:\\abc\\def.txt" ;  // \ は \\ と記述 ( " は \" と記述)

または、

string file_name = @"C:\abc\def.txt" ;   // 頭に @ を付加  ( " は "" と記述)
                                         // エスケープシーケンスは使用不可!
改行を含める場合は、

string message = @"This
is
a
pen" ;

のように、複数行で記述する。引用符の間にある文字は、全部そのまま解釈される。

文字列の文字長を取得
// 文字列の文字長を取得する

int N = ("abc日本語").Length ;  // 6

// Note: 日本語も1文字(2バイト文字)を1字としてカウントする!

文字列のバイト長を取得
// 文字列のバイト長を取得する

using System.Text ;  // for Encoding

int N = Encoding.GetEncoding("Shift_JIS").GetByteCount("abc日本語") ;  // 9

文字の繰返し文字列を設定
// 指定文字を指定回数だけ繰返した文字列を設定

string A = new String('Z', 10) ;  // "ZZZZZZZZZZ"

文字列の結合
// 複数の文字列を結合する

string A = "abc" ;
string B = "def" ;
string C ;

C  = A + B ;  // "abcdef"
A += "zzz" ;  // "abczzz"

文字列の分割
// 文字列を、指定した区切り文字で分割する

string   A = "abc:def:ghi" ;
string[] B = A.Split(new char[] {':'}) ;  // B[0] = "abc"
                                          // B[1] = "def"
                                          // B[2] = "ghi"

// Note: 区切り文字を省略した場合、空白/改行コードが、区切り文字となる。

文字列の削除
// 文字列の中の特定部分を削除する

string A  = "abcdefg" ;
int    N1 = 2 ;                // 削除する開始位置
int    N2 = 4 ;                // 削除する文字長

string B = A.Remove(N1, N2) ;  // "abg"

// Note: 開始位置や文字長が不適切だと、例外が発生する!

文字列の抽出
// Substring() による文字列の抽出

string A  = "abcde" ;
int    N1 = 1 ;                   // 抽出する開始位置
int    N2 = 2 ;                   // 抽出する文字長(省略可)

string B = A.Substring(N1) ;      // "bcde"
string C = A.Substring(N1, N2) ;  // "bc"

string D = A.Substring(5) ;       // ""
string E = A.Substring(6) ;       // 例外が発生!

// Note: 開始位置や文字長が不適切だと、例外が発生する!

// index による1文字(char)の抽出 配置 Button, TextBox ; private void button1_Click(object sender, System.EventArgs e) { string A = "abcd" ; for (int N = 1 ; N <= A.Length ; N ++) { textBox1.Text += N.ToString() + "番目の文字は " + A[N - 1] + " です\r\n" ; } }

文字列の検索 (一般)
// 普通の検索

string A = "abcdecd" ;         // 被検索文字列
string B =   "cd"    ;         // 検索文字列(見つかる例)
string C =   "cc"    ;         // 検索文字列(見つからない例)

int    D = A.IndexOf(B) ;      //  2(最初の見つかった位置)
int    E = A.IndexOf(C) ;      // -1(見つからなかった)
int    F = A.LastIndexOf(B) ;  //  5(最後の見つかった位置)

文字列の検索 (正規表現) ☆ 正規表現 テスター
// 正規表現による検索

using System.Text.RegularExpressions ;  // for Regex

string A = "abcde777"  ;    // 被検索文字列
string B =   "c[a-z]+" ;    // 検索文字列(見つかる例)

Match match = Regex.Match(A, B) ;

int    C = match.Index   ;  // 2    (最初の見つかった位置)
int    D = match.Length  ;  // 3    (一致した部分の文字長)
string E = match.Value   ;  // "cde"(一致した文字列)
bool   F = match.Success ;  // true (一致したか)

// Note:「一致したか」は、Regex.IsMatch(被検索文字列, 検索文字列) メソッドも同様。

文字列の置換 (一般)
// 普通の置換

string A = "abcdefgcd" ;      // 対象文字列
string B = "cde" ;            // 被置換文字列 ("cde" を探して)
string C = "xxx" ;            // 置換文字列   ("xxx" に置換)

string D = A.Replace(B, C) ;        // ← "abxxxfgcd"

string E = A.Replace("cd", "xx") ;  // ← "abxxefgxx"

// Note: 対象文字列に出現するすべての被置換文字列を、置換文字列へ置換する。

文字列の置換 (正規表現) ☆ 正規表現 テスター
// 正規表現による置換

using System.Text.RegularExpressions ;  // for Regex

string A = "abcdefg" ;                  // 対象文字列
string B = "[c-e]"   ;                  // 被置換文字列('c','d','e'を探して)
string C = "x"       ;                  // 置換文字列  ("x" に置換)

string D = Regex.Replace(A, B, C) ;     // "abxxxfg"

string E = "ab12cd34" ;                 // 対象文字列
string F = "(?<name1>[0-9]+)" ;         // 被置換文字列(数字列を探して)
string G = "X${name1}Y" ;               // 置換文字列  (前後に "X", "Y" を挿入)

string H = Regex.Replace(E, F, G) ;     // "abX12YcdX34Y"

// Note: 対象文字列に出現するすべての被置換文字列を、置換文字列へ置換する。

小文字/大文字へ変換
// 文字列を、小文字(または大文字)へ変換する

string A = "Test" ;
string B = A.ToLower() ;  // "test"
string C = A.ToUpper() ;  // "TEST"

文字列の空白を削除
// 先頭、末尾 の空白文字列を削除する

string A = "  abc  def  " ;

string B = A.Trim()       ;  // "abc  def"   (両端の空白を削除)
string C = A.TrimStart()  ;  // "abc  def  " (先頭の空白を削除)
string D = A.TrimEnd()    ;  // "  abc  def" (末尾の空白を削除)

// Note: 第1引数(char[])を記述すると、それが削除対象文字セットとなる。

文字列に空白を追加
// 指定文字長になるまで、空白文字列を追加する

string A = "abc" ;

string B = A.PadLeft(5)  ;  // "  abc" (左側に空白を追加)
string C = A.PadRight(5) ;  // "abc  " (右側に空白を追加)

// Note: 第2引数(char)を記述すると、それが追加文字となる。

文字列の配列をソート
// 文字列の配列をソートする

string[] str_array = new string[] { "dd", "bb", "aa", "cc" } ;

Array.Sort(str_array) ;

// 結果は下記のとおり
//   str_array[0] == "aa"
//   str_array[1] == "bb"
//   str_array[2] == "cc"
//   str_array[3] == "dd"

// 上記の要素の順序を反転するには、

Array.Reverse(str_array) ;

// 結果は下記のとおり
//   str_array[0] == "dd"
//   str_array[1] == "cc"
//   str_array[2] == "bb"
//   str_array[3] == "aa"

文字列をバイト配列へ変換
// 文字列を バイト配列データに変換する

using System.Text ;  // for Encoding

string src = "ABCDEF" ;
byte[] dst = Encoding.ASCII.GetBytes(src) ;

// 実行結果
//  dst[0] = 'A'
//  dst[1] = 'B'
//  dst[2] = 'C'
//  dst[3] = 'D'
//  dst[4] = 'E'
//  dst[5] = 'F'

バイト配列を文字列へ変換
// バイト配列データを 文字列に変換する

using System.Text ;  // for Encoding

byte[] src    = new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E' } ;
int    index  = 1 ;
int    length = 3 ;
string dst    = Encoding.ASCII.GetString(src, index, length) ;  // 実行結果 "BCD"

文字列のコレクション
// 文字列のコレクションは、文字列の配列と似ているが、
// あらかじめ要素の大きさを宣言しなくて良い

using System.Collections.Specialized ;  // for StringCollection

StringCollection str_col = new StringCollection() ;  // コレクションの宣言

str_col.Add("aa") ;  // "aa" をコレクションの要素として追加
str_col.Add("bb") ;  // "bb" をコレクションの要素として追加
str_col.Add("cc") ;  // "cc" をコレクションの要素として追加
str_col.Add("dd") ;  // "dd" をコレクションの要素として追加

foreach (string A in str_col)
{
    /* コレクションの各要素を A に取り出して処理する */
}

先頭が数字か判定 ☆ 正規表現 テスター
// 文字列の先頭文字が数字か判定する

using System.Text.RegularExpressions ;  // for Regex

string A = "123abc" ;  // 判定対象の文字列

if (Regex.Match(A, "^[0-9]").Success)
{
    /* 文字列 A の先頭が数字の場合の処理 */
}

// Note: 全角の数字も含める場合、正規表現の "^[0-9]" を "^\\d" に変更する。

指定の文字をカウント
// 文字列の中に、指定した文字がいくつあるか数える

// 'i' がいくつあるか数える

string A = "This is a pen." ;
int    N = A.Split(new char[] {'i'}).Length - 1 ;  // N ← 2

指定文字列の有無を判定 ☆ 正規表現 テスター
// 文字列 text に、文字列『 今日 or 明日 or 昨日 』が含まれるか判定する

using System.Text.RegularExpressions ;  // for Regex

if (Regex.IsMatch(text, "(今日|明日|昨日)"))
{
    /* 指定した文字列が含まれる場合の処理 */
}

1行目と2行目以降の分割
// TextBox のテキスト(文字列)を、1行目と2行目以降に分割する

using System.Text.RegularExpressions ;  // for Regex

string text = textBox1.Text ;  // テキスト全体の取得

string line_1 = text ;         // 1行目のテキスト格納用
string line_2 = "" ;           // 2行目以降のテキスト格納用

Match match = Regex.Match(text, "\n(.+)") ;
if (match.Success)
{
    line_1 = text.Substring(0, match.Index + 1) ;  // 行末の改行コードも含める
    line_2 = text.Substring(match.Index + 1) ;
}

Tab コードを空白に置換
// TextBox のテキスト(文字列)中の Tab コードを、適切な文字長の空白に置換して、
// 結果を、文字列変数 text に入れる

using System.Text.RegularExpressions ;  // for Regex

string text    = "" ;  // 置換結果を入れる
int    tab_len = 8  ;  // Tab を8文字単位で機能させる

foreach (string A in textBox1.Text.Split(new char[] {'\n'}))
{
    string B = A ;
    while (true)
    {
        Match match = Regex.Match(B, "\t(.*)") ;
        if (match.Success)
        {
            B = B.Substring(0, match.Index) +
                new String(' ', tab_len - match.Index % tab_len) +
                match.Groups[1].Value ;
        }
        else
        {
            if (text != "")
            {
                text += "\n" ;
            }
            text += B ;
            break ;
        }
    }
}

// Note: TextBox で Tab コードの入力を可能にするために、AcceptsTab プロパティを
//       True にする必要あり。

改行コードの数を取得
// TextBox のテキスト(文字列)中の 改行コード "\n" の数を調べる

using System.Text.RegularExpressions ;  // for Regex

int N = Regex.Matches(textBox1.Text, "\n").Count ;

文字列の改行コードを削除
// 文字列の行末の改行コードを削除する

string A = "abc def \r\n" ;
string B = A.TrimEnd(new char[] {'\r', '\n'}) ;  // "abc def "

テキストを1行単位に分割
// テキスト(複数行の文字列) text を1行単位に分割して、文字列配列 line に入れる

string[] line = text.Replace("\r", "").Split(new char[] {'\n'}) ;

指定バイト長に削除/追加
// 日本語を含む文字列を、指定バイト長になるように削除/追加する

// 文字列が長い場合、語末の文字を削除する
// 文字列が短い場合、語末に空白を追加する

using System.Text ;  // for Encoding

private string str_byte(string str, int len)
{
    // str = 対象文字列
    // len = 指定バイト長

    Encoding enc = Encoding.GetEncoding("Shift_JIS") ;  // 文字は Shift_JIS を想定

    string A = str.PadRight(len) ;
    string B = "" ;
    int    M = 0  ;

    for (int N = len ; N >= 0 ; N --)
    {
        B = A.Substring(0, N) ;
        M = enc.GetByteCount(B) ;
        if (M <= len) break ;
    }
    if (M < len) B += " " ;  // 空白追加

    return B ;
}

文字列処理 (コマンドライン)
// textBox1 を「コマンドライン」とみなして、そこに入力された文字列を、
// コマンドと引数に分離し、textBox2 に [コマンド][引数] 形式で表示する



配置 Button, TextBox, TextBox ;

using System.Text.RegularExpressions ;  // for Regex

private void button1_Click(object sender, System.EventArgs e)
{
    string cmd ;
    string arg ;
    get_cmd(textBox1.Text, out cmd, out arg) ;
    textBox2.AppendText(
        textBox1.Text + "\r\n" +
        "[" + cmd + "][" + arg + "]" + "\r\n" +
        "\r\n") ;
}

private void get_cmd(string line, out string cmd, out string arg)
{
    // 1行の文字列(line)から コマンド(cmd)と 引数(arg)を 抽出する

    // Note: コマンドは、引用符で挟まれた形式でもOKで、
    //       この場合、引用符を除いて返す。
    //       引数は、引用符を残して そのまま返す。

    // Note:「//」以降は、コメントとみなす。
    //       たとえ、引用符で挟まれた中にあっても!
    //       ただし「://」は、コメント開始とは みなさない!

    Match match ;
    cmd = "" ;
    arg = "" ;

    // コメントの削除
    match = Regex.Match(line, "[^:]//") ;
    if (match.Success)
    {
        line = line.Substring(0, match.Index + 1) ;
    }
    if (line.IndexOf("//") == 0)
    {
        line = "" ;
    }

    // コマンドと引数の分離
    line = line.Trim() ;
    match = Regex.Match(line, "^\"([^\"]*)\"") ;
    if (match.Success)
    {
        //「"cmd"」型
        cmd = match.Groups[1].Value ;
        arg = line.Substring(match.Length) ;
    }
    else
    {
        //「cmd」型
        match = Regex.Match(line, "^([^ ]+)") ;
        if (match.Success)
        {
            cmd = match.Groups[1].Value ;
            arg = line.Substring(match.Length) ;
        }
    }
    arg = arg.Trim() ;
}

文字列の半角/全角変換
// Visual Basic の StrConv 関数を使って、文字列を半角/全角変換する

// textBox1 の文字列を、半角変換して textBox2 に表示する
// textBox1 の文字列を、全角変換して textBox3 に表示する



配置 Button, TextBox, TextBox, TextBox ;

using Microsoft.VisualBasic ;  // for Strings.StrConv()

private void button1_Click(object sender, System.EventArgs e)
{
    // 半角へ変換
    textBox2.Text = Strings.StrConv(textBox1.Text, VbStrConv.Narrow, 0x0411) ;

    // 全角へ変換
    textBox3.Text = Strings.StrConv(textBox1.Text, VbStrConv.Wide,   0x0411) ;
}

// Note: 上記、0x0411 は、日本語での Locale ID を示す。

// Note: "using Microsoft.VisualBasic ;" を有効にするためには 参照の追加 が必要。
//       具体的には、メインメニューで、プロジェクト → 参照の追加... を選択して、
//       .NET のコンポーネント名「Microsoft Visual Basic .NET Runtime」を追加する。

// Note: 下記のような変換も可能。
//         全角カタカナ → 全角ひらがな 変換 = VbStrConv.Hiragana
//         全角ひらがな → 全角カタカナ 変換 = VbStrConv.Katakana

(C)緑のバイク