メイン

C# アーカイブ

2007年02月15日

半角カナを全角に変換

たまに使うのでメモ

private string ChangeWideKana(string val)
{
  string sHalfChars  = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」゙゚";
  string sFullChars  = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ"
                     + "マミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。ー「」゛゜";
  string sFullCharsB = "  ヴ  ガギグゲゴザジズゼゾダヂヅデド     バビブベボ"
                     + "                                ";
  string sFullCharsP = "                         パピプペポ"
                     + "                                ";
  
  if (val == null) return null;
  if (val.Length == 0) return "";

  StringBuilder result = new StringBuilder();

  int idx = 0;
  while (idx < val.Length)
  {
    char cCur = val[idx];
    int idxCurChar = sHalfChars.IndexOf(cCur);
    if (idxCurChar > -1)
    {
      int char_type = 0; //0:通常 1:濁音 2:半濁音

      //濁音、半濁音のチェック
      if (idx < (val.Length-1))
      {
        if ((val[idx+1] == '゙') && (sFullCharsB[idxCurChar] != ' '))
        {
          char_type = 1;
        }
        else if ((val[idx+1] == '゚') && (sFullCharsP[idxCurChar] != ' '))
        {
          char_type = 2;
        }
      }
      
      //マッピングにより半角→全角変換
      switch (char_type)
      {
        case 0: //普通のカタカナ
          result.Append(sFullChars[idxCurChar]);
          break;
        case 1: //濁音
          result.Append(sFullCharsB[idxCurChar]);
          idx++;
          break;
        case 2: //半濁音
          result.Append(sFullCharsP[idxCurChar]);
          idx++;
          break;                      
      }
    
    }
    idx++;
  }
  return result.ToString();
}

2007年02月14日

バイト数指定で文字列を切り出す

■方式1
private string LeftB(string str,int len)
{
        System.Text.Encoding _encode 
                = System.Text.Encoding.GetEncoding("Shift_JIS");

        byte[] bytes = _encode.GetBytes(str);
        int bytelen = bytes.Length;
        if (len > bytelen) len = bytelen;

        return _encode.GetString(bytes,0,len);
}
※この方法だと最後にゴミコードが残り、他の文字と連結させた場合などに 不具合が発生する場合があるのでお勧めしません。

たとえば次のコードを実行すると。
int len = 5;
string val = "あいうえお";
Debug.WriteLine("[" + LeftB(val,len) + "]" );
Debug.WriteLine("------");
[あい]
------

って出力されると思うけど実際には

[あい------

って出力されてしまいます。

■方式2
ちょっと遅いけど安全
private string LeftB(string str,int len)
{       
        if (str == null) return null;
        if (str.Length == 0) return "";

        System.Text.Encoding _encode 
                = System.Text.Encoding.GetEncoding("Shift_JIS");

        int iResultLen = 0;
        StringBuilder sb = new StringBuilder();
        for (int i=0;i<str.Length;i++)
        {
                char cCur = str[i];
                int iCharLen = _encode.GetByteCount(new char[1]{cCur});
                iResultLen += iCharLen;
                if (iResultLen > len)
                {
                        break;
                }
                
                sb.Append(cCur);
        }
        return sb.ToString();
}

2006年08月31日

[C#]特定の文字を使ってランダムな文字列を作成する

以下みたいな感じで文字列を作成できます。
この方法は使用する文字の設定が簡単なことが特徴ですね。

public class RandomString
{
       
        //結果の文字列で使用する文字を設定
        //ここではA~Z、0~9を使用
        private const string BASECHAR = "ABCDEGHIJKLMNOPQRSTUVWXYZ0123456789"

        
        //ランダム値生成オブジェクト
        private Random m_random = new Random();

        
        /// <summary>
        /// ランダムな文字列を返す
        /// </summary>
        /// <param name="len">文字長</param>
        /// <returns>生成されたランダムな文字列</returns>
        public string MakeRamdonString(int len)
        {
        
                int iSrcLen = BASECHAR.Length;
                StringBuilder sb = new StringBuilder();
                for (int i=0;i<len;i++)
                {
                        int idx = m_random.Next(0,iSrcLen-1);
                        sb.Append(BASECHAR[idx]);
                }
                return sb.ToString();

        }
}

2006年08月22日

[C#]EXEの実行パス

C#でEXEの実行パスを取得する時にApplication.ExecutablePathからディレクトリ名を抜き出して使ってたのですけど、ApplicationってSystem.Windows.Formsでしょ。Windowフォームなら良いけどDLLとかでそんなの使いたくないな、うん、なんか気持ち悪い。
等と思っていたら以下の方法で取得できるらしい。

using System.IO;
using System.Reflection;

string exepath 
  = Path.GetDirectoryName(
          Assembly.GetExecutingAssembly().Location);

2006年07月27日

.NETで日付フォーマットする場合の注意点

「地域と言語のオプション」で日付の書式を和暦に設定されている場合に
"yyyy/MM/dd"という形式で日付文字列を取得すると
和暦が返ってくるんです。
例えば"2006/07/26"だったら"18/07/26"みたいな。
平成18年ってことですね。

SDKによると"yyyy"は「世紀を含む 4 桁の年」ってなってますけど、
これでいいんですかね?仕様ですかそうですか。

んで、これの回避方法ですが↓

using System.Globalization;

CultureInfo culture = new CultureInfo("ja-JP",false);
string s = DateTime.Now.ToString("yyyy/MM/dd",culture);
System.Console.WriteLine(s);

です。

falseが重要。

2006年03月09日

(C#版)プロパティを列挙するToString()

よく使うのでメモ

public override string ToString()
{
   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   sb.Append(this.GetType().ToString() + "¥n");

   //プロパティを列挙する。
   System.Reflection.PropertyInfo[] properties = this.GetType().GetProperties();
   for (int i=0;i<properties.Length;i++){
      //読込み可能なプロパティのみを対象とする。
      if (properties[i].CanRead){
         System.Reflection.ParameterInfo[] param =
                  properties[i].GetGetMethod().GetParameters();
         if ((param != null) && (param.Length > 0)){
            continue;
         }

         //プロパティから値を取得し、その文字列表記を保存する。
         object v = properties[i].GetValue(this,null);
         sb.Append(properties[i].Name);
         sb.Append(" = ");
         sb.Append("¥'" + v.ToString() + "¥'¥n");
            
      }
   }

   return sb.ToString();
}

2006年03月06日

.NETコントロールのTextBoxをオーナードロー

.NETでフォーマット機能付きTextBoxコントロールを作ってたんですど
すっごい苦労しました。。
Textプロパティの値をフォーマット(例えばカンマ区切りとか)して表示するだけなんですが。。


まず、TextBox君はそのままでOnPaintイベントが動かない!
SetStyleで"ControlStyles.UserPaint"指定すればOnPaintが走ることが判ったんですが
これに気づくまで2時間!

でもね、そしたら文字を選択状態にすると違うフォントで描画される!

マジでどうしよか?とヤバイ・・・この方式では実現不可!?!?
等と考えて、さらに2時間!
結局、"ControlStyles.UserPaint"を設定せずに、WM_PAINTを拾って、そのタイミングでコントロール内に描画することで解決。
(なんでWM_PAINT来てるのにOnPaint動かさないのかと・・・)


つか、パッと思いつかないオイラがアホでしたね・・

2004年10月13日

SharpDevelopでC# == イイ!

最近C#の勉強でもしようかとオープンソースな.NET対応IDEであるSharpDevelopで遊んでます。

フリーなんですが、VisualなGUI作成、コード補完、コードの折りたたみ等にも対応しており、機能的には商用に引けを取りません。
Eclipseにしてもjava開発では無くてはならない環境となりましたが、SharpDevelopの今後にも大きな期待を寄せております。

んで、C#って言語的には面白いですね、javaとdelphiの良いとこ取りってカンジで判りやすく、コードも綺麗に書けそうです。
今のところお仕事で使う予定は無いのですが、やりたいなぁ
どこかにC#のプロジェクトないだろか・・


ところでC#で遊んでいたら、なぜかMessageBoxなどで全角を表示しようとすると文字化けするんです。なぜ??(TT

色々調べてると、どうもDBから読み込んだりした全角文字に関しては正しく表示され、コード内のリテラルだけが文字化けするっぽいことが判りました。
はて??・・・いや!もしかして!
SharpDevelopのエディタのエンコーディングが「西ヨーロッパ」になっていただけでした(^^;