- PR -

java入力チェック

投稿者投稿内容
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-09 20:51
電話番号で自動置換してチェックと言うのをやりたいのですが、
どうも'-'に頭悩ませております。

090−...
 ↓
090-...

この時のreplaceの処理ですが何かいい方法はないでしょうか?
サンプルで2通りの置換方法を試してみました。

@
private static final char tableFnkChk[][]={
{'-','−'},
{'-','ー'},

↑拾ってきたソースなので分からないのですがこのような文字を置換していました。

Aあいまいなのでchar型に置換しているような(全角を半角に)
public static String toHalfANS(String str){
String ret="";
for(int i=0;i<str.length();i++){
int code=str.charAt(i);
if((code>=0xff01)&&(code<=0xff5e)){
ret=ret+(char)(code-0xfee0);
}else{
ret=ret+(char)code;
}
}
return ret;
}
で試してみたのですが、どうも半角ハイフンが一つのみとは思えないのですが・・
(.equals("-")でもスルーします)。

どう置換して良いのかが分からなくなってしまいました..。
電話番号チェックで確かなサンプルはありますでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-06-09 21:39
まず、具体的に何をしたいのかよくわかりません。全角ハイフンを半角ハイフンに
置換したいだけですか? また、2通りのサンプルを試してみた、とのことですが、
その結果はどうだったのでしょう? 期待通りではなかったということですか?

とにかく、予備知識のない人間にも理解できるように説明してみてください。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-09 21:49
返信ありがとうございます。

すいません、言葉が足りませんでした。
上記の2つの方法で気になったのは、置換した時に何かエンコードが
掛かってるんじゃないかという事でした。
置換処理後ハイフン部をコピーしてテキストエディタに貼り付けたら
'?'になっていましたし..。

やりたい処理は
@全角文字があれば半角に変換
Aその文字列で数値or'-'を許可、falseであればエラーに
という文字チェックです。

この時Aの'-'の許可もエンコードなど掛かっていたら.equals("-")
でも引っかからない。
そういう意味でも@の置換が大事になってくるんですが..。

どう画面からのデータをチェックすべきか、頭を悩ませています。

どなたか、ご教授ください。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-06-09 23:04
まずは、変数にどんな値が入っているか、
System.out.printlnで出力しながら確認してみましょう。
そんなに難しいことではありません。

どんな環境からどのように入力されたのかわからないため、
エンコードの問題についても回答は難しいと思います。
というか、試しにコンソールに出力すれば、
化けているか化けていないのかわかりますよね。

また、equalsの戻り値はtrue/falseであって、
「スルー」とか「引っかかる」いうのは後続の処理が行っているんですよね。
オレオレ用語ではなく、期待した値に対してどの値が戻ってきているかを
きちんと明記すると回答しやすくなると思います。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-09 23:32
ご回答ありがとうございます。

>オレオレ用語ではなく、期待した値に対してどの値が戻ってきているかを
>きちんと明記すると回答しやすくなると思います。

そうですね、ぼくも他の読んでいてイライラした経験があります。
気をつけます。

さて、対処法ですがchar型に変換してその数値でチェックする事にしました。

/**
* 電話書式チェック
*/
public boolean checkTEL(String str) {
boolean ret = true;
for (int i=0;i<str.length();i++) {
int code=str.charAt(i);
System.out.println(code+","+str.substring(i,i+1));
if (code > 47 && code < 58) {
} else if (code==8722 || code==45) {
} else {
ret = false;
}
}
return ret;
}

置換部は最初に書きました@の方法ですが、判定チェックはこんな感じにしてみました。
ちょっと電話番号のフォーマット判定など組み込む予定で、作りかけですが。

8722と45は半角ハイフンです、どんなエンコードが掛かっているのかは分かりませんが、
やはり2通りありました。
ぼくのロジック上、必ず@を通過した時には置換されているので、と言う前提条件のもと
作りましたのであまり参考にはならないと思いますが。

でも、javaのサンプルソースって意外と無いんですね、正規表現など色々探したんですが・・申し訳ないです。
ありがとうございました。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-06-10 00:45
全角ハイフンとのことですが、OSの環境によってはUnicodeへの
ベンダ依存のマッピングが影響するかもしれませんね。

http://www.ingrid.org/java/i18n/unicode.html

「MINUS SIGN」という奴です。

#個人的にはcharの値をチェックするなら16進数で0x817Cとか表記するほうが好み
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-06-10 01:25
サンプルそのものを求めるなら、Kodersがお勧めです。
http://www.koders.com/

オープンソースのコード検索サイトですが、
今回のような日本語処理はないかもしれませんね。

今回のように小さいメソッドであれば、
mainメソッドを書いて繰り返し実験して、
正しいメソッドを実装するのがお勧めです。
例えば、サーブレットとかだと、
修正→入力→確認のプロセスに時間がかかりすぎますよね。

Javaのプログラムとして正しいものが出来上がっているにもかかわらず、
想定しない動きになる場合は、入力が間違っている、
エンコーディングがおかしい等が考えられるわけです。
その時点で入力をよく確認してみるといいでしょう。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-11 15:23
情報ありがとうございます。

16進数記述ですね、char比較は全てそうなっていますね。
理論は分かるのですが、デバック等で分かりやすいこちらにしました。

エンコーディングはバチッと後々問題が出ないように、画面は完全に
Shift_JIS+メール書式+xmlの設定ファイルまでも統一したつもり
だったので、正直何故置換でエンコードが掛かるのかと..?
配列で明記した文字を単純に置き換えている訳で..?
英語圏の人は丸々悩まなくていいんですよね、うらやましい。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)