C Sharpの基礎 - 文字列

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

Console.ReadLineメソッド

Console.ReadLineメソッドは、入力された文字を1行読み取る。(戻り値はstring型)
int型を扱う場合は、型変換を行う必要がある。

 using System;
 using System.Text;
 
 namespace ReadLine
 {
    class Program
    {
       static void Main(string[] args)
       {
          Console.WriteLine("あなたは何歳ですか?");
          var age = int.Parse(Console.ReadLine());//string→int型に型変換
  
          Console.WriteLine("あなたの国の平均寿命は何歳ですか?");
          var average_age = int.Parse(Console.ReadLine());
 
          int yourlife = average_age - age;
          Console.WriteLine($"あなたはあと{yourlife}年生きれるでしょう");
       }
    }
 }



エスケープシーケンス

エスケープシーケンスとは、通常の文字列では表せない特別な機能または特別な文字を表現するものである。

  • 特別な機能
    改行(\n)やタブ(\t)などがある。
  • 特別な文字
    通常であれば、プログラム上で特別な意味を持つ言葉を、単純な文字として表現する。
    例えば、2重引用符(")を使用して単純な文字として扱う場合は、\"とする。
エスケープシーケンス 文字名
\' 単一引用符(')
\" 二重引用符(")
\\ 円記号(\)
\0 null文字
\a アラート音(警告)
\b バックスペース
\f 改ページ(フォームフィード)
\n 改行
\r 復帰(キャリッジリターン)
\t 水平タブ
\v 垂直タブ



数値を文字列として出力

  • パラメータ指定子を使用する。

{0}のところにはaの値が、{1}のところにはbの値、{2}のところにはcの値が入る。
{0}や{1}の0の部分をパラメータ指定子と呼ぶ。

 Console.WriteLine("1番目の値は{0}, 2番目の値は{1}, 3番目の値は{2}", a, b, c);


  • 文字列補間(String Interpolation)を使用する。

パラメータ指定子は、置換したい変数が多い場合、パラメーター指定子と変数の対応関係が見辛い。
この問題を解決するために、文字列補間と呼ばれる機能がC# 6.0から追加された。

 Console.WriteLine($"1番目の値は{a}, 2番目の値は{b}, 3番目の値は{c}");


  • 連結演算子を使用する。

連結演算子(+)は、文字列と文字列を接続するために使用する。
連結演算子(+)を文字列と値に使用した場合、値は文字列に変換される。

 Console.WriteLine("1番目の値は" + a + ", 2番目の値は" + b + ", 3番目の値は" + c);


※備考
ToStringメソッドを使用すると、値型を文字列型へ変換できる。
ToStringメソッドの引数を指定しない場合は、値を文字列へ単純に変換する。

値型の変数名.ToString();


書式指定子を使用する場合は、以下のように引数を指定する。

値型の変数名.ToString("書式指定子");


また、String.Formatメソッドも値型を文字列型へ変換する時に使用することができる。

書式指定子に関しては、こちらのページを参照する。


出力する文字列の幅や右左揃えの指定

文字列を出力する時、書式を指定したい場合がある。
書式を指定する場合は、以下のような項目で指定できる。

{パラメーター指定子, 書式設定フィールドの幅:書式指定文字列}


以下の記述では、0番目のパラメータ指定子に0.1234を入れて、右揃えで文字幅を10確保し、パーセント表示することを意味する。
書式設定フィールドの幅の値は、正の場合は右揃え、負の場合は左揃えを意味する。
もし、書式設定フィールドの幅よりも文字列が長い場合は、設定は無視される。(書式設定フィールドの幅は無効となる)

 Console.WriteLine("{0, 10:p}", 0.1234);



書式を指定して数値を文字列へ変換

数値の書式指定には、"標準の数値書式指定文字列"と"カスタム数値書式指定文字列"という2種類がある。
また、標準の数値書式指定文字列は、"書式指定子"と"精度指定子"の組み合わせから成る。

標準の数値書式指定文字列

書式指定子
書式指定子には、以下のようなものがある。
更に詳しく知りたい場合は、MSDNを参照する。

書式指定子 意味
c(C) 通貨
d(D) 10進法表示(整数のみ)
e(E) 浮動小数点による指数表示
f(F) 固定小数点による指数表示
g(G) eまたはfのうち簡潔な表示
n(N) 桁区切りされた表示
p(P) パーセント表示
r(R) 変換後の文字列が、変換前の数値に戻れる必要な桁数を確保して表示
(Single型、Double型、BigInteger型のみ)
(Single型は最大9桁、Double型は最大17桁まで確保する)
x(x) 16進数表示(整数のみ)
セル内のテキスト セル内のテキスト


 namespace Format
 {
    class Program
    {
       static void Main(string[] args)
       {
          // c(C) : 通貨
          Console.WriteLine("{0:c}", 100);    // \100
          Console.WriteLine("{0:c}", 200.0);  // \200
 
          // d(D) : 10進数表示(整数型のみ)
          Console.WriteLine("{0:d}", 100);     // 100
          Console.WriteLine("{0:d6}", 100);    // 000100    6桁表記
          Console.WriteLine("{0:d99}", 100);   // 0...0100  99桁表記
          Console.WriteLine("{0:d100}", 100);  // d1100
                                               // 精度指定子は0 - 99までなので不適切
                                               // 文字列d1とカスタム数値書式指定子00の組み合わせと解釈される
 
          // e(E) : 浮動小数点
          // 標準では小数点以下は6桁まで表示される
          Console.WriteLine("{0:e}", 1234);                 // 1.234000e+003
          Console.WriteLine("{0:e}", 123456789);            // 1.234568e+008
          Console.WriteLine("{0:E}", 123456789);            // 1.234568E+008
          Console.WriteLine("{0:e10}", 123456789);          // 1.2345678900e+008
          Console.WriteLine("{0:e10}", 1.23456789);         // 1.2345678900e+000
          Console.WriteLine("{0:e10}", 12345.67891234567);  // 1.2345678912e+004
 
          // f(F) : 固定小数点
          // 標準では小数点以下は2桁まで表示される
          Console.WriteLine("{0:f}", 1234);                 // 1234.00
          Console.WriteLine("{0:f}", 1.23456789012345);     // 1.23
          Console.WriteLine("{0:f}", 12345.67891234567);    // 12345.68
          Console.WriteLine("{0:f10}", 1.23456789012345);   // 1.2345678901
          Console.WriteLine("{0:f10}", 12345.67891234567);  // 12345.6789123457
 
          // g(G) : 浮動小数点か固定小数点のうち最適な方を自動で選択されて表示される
          // 0.0001未満の値を扱う場合や精度指定子から数値があふれている場合、浮動小数点による表記
          Console.WriteLine("{0:g}", 123456789.012345);     // 123456789.012345  固定小数点
          Console.WriteLine("{0:g5}", 123456789.012345);    // 1.2346e+08        浮動小数点
          Console.WriteLine("{0:g}", 0.0001);               // 0.0001            固定小数点
          Console.WriteLine("{0:g}", 0.000099);             // 9.9e-05           浮動小数点
  
          // n(N) : 3桁間隔で区切る
          // 標準では小数点以下は2桁までのみ表示される
          Console.WriteLine("{0:n}", 1234);                     // 1,234.00
          Console.WriteLine("{0:n}", 123456789);                // 123,456,789.00
          Console.WriteLine("{0:n}", 1.23456789012345);         // 1.23
          Console.WriteLine("{0:n}", 123456789.1234);           // 123,456,789.12
          Console.WriteLine("{0:n4}", 123456789.1234);          // 123,456,789.1234
 
          // p(P) : パーセント表示
          // 標準では%表記で小数点2桁までのみ表示される
          Console.WriteLine("{0:p}", 0.12);                     // 12.00%
          Console.WriteLine("{0:p}", 0.123456);                 // 12.35%
          Console.WriteLine("{0:p}", 1.2345);                   // 123.45%
          Console.WriteLine("{0:p4}", 0.123456789);             // 12.3457%  小数点4桁まで
 
          // r(R) : ラウンドトリップ書式指定子
          Console.WriteLine("{0:r}", 12.34567);                 // 12.34567
          Console.WriteLine("{0:r}", 12.34567890123456789f);    // 12.345679  flaot型は9桁のみ表示される
          Console.WriteLine("{0:r15}", 12.34567890123456789f);  // 12.345679  同様にflaot型なので9桁のみ表示される
          Console.WriteLine("{0:r}", 12.34567890123456789);     // 12.345678901234567  double型は17桁のみ表示される
          //Console.WriteLine("{0:r}", 1234);                   // 整数はエラーが起きる
 
          // x(X) : 16進数表示
          Console.WriteLine("{0:x}", 9);   // 9
          Console.WriteLine("{0:X}", 10);  // A
          Console.WriteLine("{0:x}", 10);  // a
          Console.WriteLine("{0:x}", 15);  // f
          Console.WriteLine("{0:x}", 16);  // 10
          Console.WriteLine("{0:x}", 17);  // 11
       }
    }
 }


精度指定子
精度指定子は、数値の精度を指定するために使用する。
精度指定子には、0 - 99の整数が入る。また、設定しない場合は既定値が使用される。

※注意
ラウンドトリップ書式指定子r(R)については、精度指定子を指定する必要がないので、指定した場合は無視される。

以下のサンプルコードでは、書式指定子はd、精度指定子が6となり、10進数表示で6桁分確保される。

 Console.WriteLine("{0:d6}", 100);

出力は、以下のようになる。

000100


カスタム数値書式指定文字列

カスタム数値書式指定文字列は、1つ以上のカスタム数値書式指定子で構成される。

カスタム数値書式指定子には、以下のようなものがある。
更に詳しく知りたい場合は、MSDNを参照する。

書式指定子 意味
0 対応する位置に数字がない場合、0に置き換える
# 対応する数字がある場合#を数字に置き換える。
.(ドット) 小数点
,(カンマ) 桁区切り
% 100を乗じて、%(パーセント記号)をつける。
1000を乗じて、‰(パーミル記号)をつける。
E0 指数表示
\ カスタム書式指定子を単なる文字として解釈する。
;(セミコロン) 正、負、ゼロの場合に対してそれぞれ異なる書式指定子を指定したい時に使用


 namespace Coustom
 {
    class Program
    {
       static void Main(string[] args)
       {
          int num = 0;
 
          // 0に対応する位置に数値が入っていない場合は、0が表示される
          Console.WriteLine("{0:00.00}", 1.2);  // 01.20
 
          // 小数点以下にある0の数が、小数点以下の表示桁数になる(入りきらない部分は四捨五入)
          Console.WriteLine("{0:00.00}", 123.454);  // 123.45
          Console.WriteLine("{0:00.00}", 123.455);  // 123.46
 
          num = 123;
 
          // #に対応する位置に数値が入っていない場合は、その部分は表示しない(無意味な0は表示しない)
          Console.WriteLine("{0:##.##}", 1.2);      // 1.2
          Console.WriteLine("{0:##.##}", 001.200);  // 1.2
 
          // 小数点以下にある0の数が、小数点以下の表示桁数になる(入りきらない部分は四捨五入)
          Console.WriteLine("{0:##.##}", 123.400);  // 123.4
          Console.WriteLine("{0:##.##}", 123.454);  // 123.45
          Console.WriteLine("{0:##.##}", 123.455);  // 123.46
 
          num = 123456789;
 
          Console.WriteLine(num.ToString("(###)-###-###"));        // (123)-456-789
          Console.WriteLine(num.ToString("(###)-###"));            // (123456)-789
          Console.WriteLine(num.ToString("(###)-###-###-(###)"));  // ()-123-456-(789)
 
          Console.WriteLine("{0:#,#}", 123456789);      // 123,456,789
          Console.WriteLine("{0:#,}千", 123456789);     // 123457千
          Console.WriteLine("{0:#,,}百万", 123456789);  // 123百万
 
          Console.WriteLine("{0:#,##0}", 123456);   // 123,456
          Console.WriteLine("{0:#,##0}", 1234.56);  // 1,235
          Console.WriteLine("{0:#,##0}", 0.01);     // 0
 
          Console.WriteLine("{0:#,##0.00}", 123456);   // 123,456.00
          Console.WriteLine("{0:#,##0.00}", 1234.56);  // 1,234.56
          Console.WriteLine("{0:#,##0.00}", 0.01);     // 0.01
          Console.WriteLine("{0:0##,##,##}", 123);     // 0,000,123
  
          Console.WriteLine("% のテスト:パーセント");
 
          // %単体だと%の記号が表示される(#や0等を使う)
          // 小数点以下にある0の数が、小数点以下の表示桁数になる(入りきらない部分は四捨五入)
          Console.WriteLine("{0:%}", 1.2);         // %(不適切な設定)
          Console.WriteLine("{0:#%}", 1.2);        // 120%
          Console.WriteLine("{0:0%}", 1.2);        // 120%
          Console.WriteLine("{0:#%}", 001.200);    // 120%
          Console.WriteLine("{0:0%}", 001.200);    // 120%
          Console.WriteLine("{0:#.#%}", 0.12345);  // 12.3%
          Console.WriteLine("{0:0.0%}", 0.12345);  // 12.3%
 
          // ‰単体だと‰の記号が表示される(#や0等を使う)
          // 小数点以下にある0の数が、小数点以下の表示桁数になる(入りきらない部分は四捨五入)
          Console.WriteLine("{0:‰}", 1.2);         // ‰(不適切な設定)
          Console.WriteLine("{0:#‰}", 1.2);        // 1200‰
          Console.WriteLine("{0:0‰}", 1.2);        // 1200‰
          Console.WriteLine("{0:#‰}", 001.200);    // 1200‰
          Console.WriteLine("{0:0‰}", 001.200);    // 1200‰ 
          Console.WriteLine("{0:#.#‰}", 0.12345);  // 123.5‰
          Console.WriteLine("{0:0.0‰}", 0.12345);  // 123.5‰
 
          // "E0"、"E+0"、"E-0"、"e0"、"e+0", "e-0"のどれかで書く
          // E+0単体だとE+0の記号が表示される(#や0等を使う)
          Console.WriteLine("{0:E+0}", 1.2);          // E+0(不適切な設定)
          Console.WriteLine("{0:#.#e0}", 123);        // 1.2e2
          Console.WriteLine("{0:#.#E0}", 123);        // 1.2E2
          Console.WriteLine("{0:#.#E-0}", 1.23E+20);  // 1.2E20
          Console.WriteLine("{0:#.#E+0}", 1.23E+20);  // 1.2E+20
          Console.WriteLine("{0:#.#E0}", 1.23E+20);   // 1.2E20
          Console.WriteLine("{0:#.#E-0}", 1.23E-20);  // 1.2E-20
          Console.WriteLine("{0:#.#E+0}", 1.23E-20);  // 1.2E-20
          Console.WriteLine("{0:#.#E0}", 1.23E-20);   // 1.2E-20
 
          // カスタム書式指定子を単なる文字として解釈する(#  0  .(ドット)  ,(カンマ)  %  ‰に対して使用)
          Console.WriteLine("{0:000.##}", 12.45);         // 012.45
          // エスケープシーケンスと勘違いされないようにする(\文字は2つ必要)
          Console.WriteLine("{0:\\#\\# 000.##}", 12.45);  // ## 012.45
          // @を使用して逐次的リテラル文字列として扱う(\文字は1つでよい)
          Console.WriteLine(@"{0:\#\# 000.##}", 12.45);   // ## 012.45
  
          // 正、負、ゼロのそれぞれの場合で書式指定子を変更する
          // {正または負の場合; ゼロの場合}
          Console.WriteLine("{0:##.##;}", 1.2);        // 1.2
          Console.WriteLine("{0:##.##;}", -1.2);       // -1.2
 
          // {正またはゼロの場合; 負の場合}
          Console.WriteLine("{0:#0.##;00.00}", 1.2);   // 1.2
          Console.WriteLine("{0:#0.##;00.00}", -1.2);  // 01.20
          Console.WriteLine("{0:#0.##;00.00}", 0);     // 0
 
          // {正の場合; 負の場合; ゼロの場合}
          Console.WriteLine("{0:##.##;-00.00;ゼロです}", 1.2345);   // 1.23
          Console.WriteLine("{0:##.##;-00.00;ゼロです}", -1.2345);  // -01.23
          Console.WriteLine("{0:##.##;-00.00;ゼロです}", 0);        // ゼロです
       }
    }
 }



StringBuilderクラス

C#において、文字列を+で繋ぐ方法は処理に負担が掛かるため、速度を重視する場合は、StringBuilderクラスを使用する。
StringBuilderクラスのAppendメソッドを使用する場合、数100倍以上、処理速度が向上することがある。

 using System.Text
 
 StringBuilder stb = new StringBuilder("今日の日付 : ");
 stb.Append(DateTime.Today);
 stb.Append("\n");
 
 Console.WriteLine(stb.ToString());



文字列の検索

前方一致

文字列に特定の文字がどの位置に含まれているか確認する場合、IndexOfメソッドを使用する。
以下の例では、"あいうえお"の中に"う"は先頭の文字(0番目)から数えて2番目、"えお"は3番目、"か"および"いか"は存在しないため-1となる。

 string str = "あいうえお";
 
 Console.WriteLine(str.IndexOf("う"));
 Console.WriteLine(str.IndexOf("えお"));
 Console.WriteLine(str.IndexOf("か"));
 Console.WriteLine(str.IndexOf("いか"));
 
 # 出力
 2
 3
 -1
 -1


前方一致と後方一致

文字列の検索において、前方一致や後方一致を指定して検索する場合、以下のように記述する。

 string filename = “”abcde.txt””;
 
 if (filename.StartsWith("ab"))
 {
    Console.WriteLine("前方一致");
 }
 
 if (filename.EndsWith(".txt"))
 {
    Console.WriteLine("後方一致");
 }



空文字またはnullの確認

空文字の確認を行う場合、String.Emptyメソッドを使用する。 また、空文字またはNULLの確認を行う場合、String.IsNullOrEmptyメソッドを使用する。

 string str = "";
 if (str == String.Empty)
 {
    Console.WriteLine("空文字です。");
 }
 
 str = null;
 if (String.IsNullOrEmpty(str))
 {
    Console.WriteLine("nullか空文字です。");
 }


また、空白文字またはNULLの確認を行う場合、String.IsNullOrWhiteSpaceメソッドを使用する。

 string str = "";
 if (String.IsNullOrWhiteSpace(str))
 {
    Console.WriteLine("nullか空白です。"");
 }



文字列の分割と結合

文字列を指定した文字で区切り、区切った文字列を結合する。

 string csv1 = "あああ,いいい,ううう";
 
 // Splitメソッドで区切って配列aryValuesに変換
 string[] aryValues = csv.Split(",");
 foreach(var value in aryValues)
 {
    Console.WriteLine(value);
 }
 
 // JoinメソッドでCSV形式に変換
 string csv2 = String.Join(",", ary);
 Console.WriteLine(join);
 
 # 出力
 あああ
 いいい
 ううう
 あああ,いいい,ううう



文字列の部分抽出と部分削除

部分抽出

文字列から一部を抽出する場合、以下のように記述する。
以下の例では、0番目の文字から数えて2番目の文字から2文字を抽出している。

 string str = "あいうえお";
 
 Console.WriteLine(str.Substring(2, 2));
 
 # 出力
 うえ


部分削除

文字列の前後の空白やエスケープシーケンスを削除する場合、以下のように記述する。
以下の例では、文字列の前後の全角半角スペースとエスケープシーケンスを削除しているが、途中にあるものは残ってしまう。

 string str = "\t あ\nい う えお \n";
 
 Console.WriteLine("." + str.Trim() + ".");
 
 # 出力
 .
   えお.


以下の例では、指定した範囲を削除している。
0番目の文字から数えて、1番目から3番目の文字を削除している。

 string str = "あいうえお";
 
 Console.WriteLine(str.Remove(1,3));
 
 # 出力
 あお