質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • C#

    7400questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

【C#】半角に変換したい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,017

Keisuke_02

score 2

前提・実現したいこと

C#で入力された文字列を半角に変換したいです。

発生している問題・エラーメッセージ

下記の該当のソースコードで、全角の配列を元に半角の配列に変換していきたいです。

該当のソースコード

string[] hankakuArray = new string[142] { "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ア", "ア", "ア", "イ", "イ", "イ", "ウ", "ウ", "ウ", "エ", "エ", "エ", "オ", "オ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "ツ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ヤ", "ヤ", "ユ", "ユ", "ユ", "ヨ", "ヨ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "`", "゙", "゚", "、", ".", "「", "」", "(", ")", "/", "-", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", "-", "-", "\\" };

string[] zenkakuArray = new string[142] { "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ァ", "ィ", "イ", "ィ", "ゥ", "ウ", "ゥ", "ェ", "エ", "ェ", "ォ", "オ", "ォ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ャ", "ヤ", "ュ", "ュ", "ユ", "ョ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "`", "゛", "゜", "、", ".", "「", "」", "(", ")", "/", "ー", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ー", "‐", "-", "¥" };

試したこと

for (var i = 0; i < zenkakuArray.Length; i++)
{
  value = Regex.Replace(val, zenkakuArray[i], hankakuArray[i]);
}

補足情報(言語/FW/ツール等のバージョンなど)

valueが入力された値。
valがstringにConvertToStringした値。

初めての質問で右も左もわかりませんが、ご教示のほどお願いいたします。ボールドテキスト

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

static string ConvertZenToHan(string value)
{
    string result = value;

    for (var i = 0; i < zenkakuArray.Length; i++)
    {
        result = Regex.Replace(result, zenkakuArray[i], hankakuArray[i]);
    }

    return result;
}

別にRegex使わなくても行けそうですが。

result = result.Replace(zenkakuArray[i], hankakuArray[i]);

指定した文字だけ Microsoft.VisualBasic.Strings.StrConv したいのであれば、

static string ConvertZenToHan(string value)
{
    return  Regex.Replace(value,
                          "[ガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポヴァアァィイィゥウゥェエェォオォカキクケコサシスセソタチッッツテトナニヌネノハヒフヘホマミムメモャャヤュュユョョヨラリルレロワヲン`゛゜、.「」()/ー1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZー‐-¥]",
                          (m) => Microsoft.VisualBasic.Strings.StrConv(m.Value, Microsoft.VisualBasic.VbStrConv.Narrow));
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 10:59

    ありがとうございます。
    今回はworkaholist様のご回答を採用させていただきました。

    キャンセル

+1

`Microsoft.visualbasic'の参照の追加を行うと、下記の様に書けます。

String hankaku = "ハンカクヲゼンカクニ";
String Zenkaku = Microsoft.VisualBasic.Strings.StrConv(hankaku, Microsoft.VisualBasic.VbStrConv.Wide);
MessageBox.Show(Zenkaku); //出力は「ハンカクヲゼンカクニ」

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 10:17

    言葉足らずで申し訳ございませんでした。
    私もそれで書こうと思ったのですが、会社が指定した文字だけ変換をしたい次第です。
    それであのような配列を準備しております。

    キャンセル

+1

以下の記事は、記事のタイトルにあるように数字の変換ですが、これの応用で質問者さんのやりたいことができませんか?

全角数字を半角に変換
http://surferonwww.info/BlogEngine/post/2016/01/15/convert-numeric-zenkaku-character-to-hankaku.aspx

全角 / 半角の変換には Microsoft.VisualBasic 名前空間の Strings.StrConv メソッドがよく使われているようです。

しかしながら、Strings.StrConv メソッドはローケルの違いとか XP 互換モードで期待した結果にならないという問題があるそうです。

なので、Strings.StrConv メソッドは使わないで、IEnumerable.Select 拡張メソッドと自作した辞書を実装しています。

その辞書と正規表現を質問者さんがカバーしたい範囲まで拡張するようにしてはいかがでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 11:01

    ご回答ありがとうございました。
    今回は社内的にC#初心者が多いので、可読性の高い方を採用させていただきました。
    今後ともよろしくお願いいたします。

    キャンセル

+1

安直にDictionary型を使ったらいいのではないかと思いますが、どうでしょう?

Dictionary(TKey,TValue)クラス

using System.Collections.Generic;

string[] hankakuArray = new string[142] { "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ア", "ア", "ア", "イ", "イ", "イ", "ウ", "ウ", "ウ", "エ", "エ", "エ", "オ", "オ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "ツ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ヤ", "ヤ", "ユ", "ユ", "ユ", "ヨ", "ヨ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "`", "゙", "゚", "、", ".", "「", "」", "(", ")", "/", "-", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", "-", "-", "\\" };
string[] zenkakuArray = new string[142] { "ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ァ", "ィ", "イ", "ィ", "ゥ", "ウ", "ゥ", "ェ", "エ", "ェ", "ォ", "オ", "ォ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ャ", "ヤ", "ュ", "ュ", "ユ", "ョ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヲ", "ン", "`", "゛", "゜", "、", ".", "「", "」", "(", ")", "/", "ー", " ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ー", "‐", "-", "¥" };

zenHanDict<string, string> = zenkakuArray.Zip(hankakuArray, (k,v) => new {k, v}).ToDictionary(a => a.k, a => a.v);

少々特殊な記法を使っているのかもしれませんので初学者殺し感が否めませんので、少し解説。

Zip という関数を使って、一気に配列を処理しております。

また => という記号は、ラムダ式 というもので、乱暴に言うと、
「その場だけで使う関数を定義する」
というものです。

詳しいお話は、 関数型プログラミング や LINQ で調べてみてください。

 参考資料

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 11:02

    ご回答ありがとうございました。
    少し難しい書き方でしたので、C#初心者が多い社内の可読性を踏まえて今回はシンプルな書き方にしました。
    C#はまだまだ探究の余地がありそうなので、とても勉強になりました。
    今後ともよろしくお願いいたします。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7400questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。