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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

4回答

3231閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2017/09/12 01:00

###前提・実現したいこと
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した値。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

C#

1static string ConvertZenToHan(string value) 2{ 3 string result = value; 4 5 for (var i = 0; i < zenkakuArray.Length; i++) 6 { 7 result = Regex.Replace(result, zenkakuArray[i], hankakuArray[i]); 8 } 9 10 return result; 11}

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

C#

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

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

C#

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

投稿2017/09/12 01:22

編集2017/09/12 01:39
workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/12 01:59

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

0

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

Dictionary(TKey,TValue)クラス

C#

1using System.Collections.Generic; 2 3string[] 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", "-", "-", "-", "\\" }; 4string[] 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", "ー", "‐", "-", "¥" }; 5 6zenHanDict<string, string> = zenkakuArray.Zip(hankakuArray, (k,v) => new {k, v}).ToDictionary(a => a.k, a => a.v);

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

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

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

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

参考資料

投稿2017/09/12 01:28

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/12 02:02

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

0

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

全角数字を半角に変換
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 01:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/12 02:01

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

0

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

C#

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

投稿2017/09/12 01:15

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/12 01:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問