- PR -

java入力チェック

投稿者投稿内容
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-06-11 23:03
String repSrc = "0123456789−―";
String repDst="0123456789--";

とかやっといて、repSrcのindexOfが-1ならそのまま、0以上ならrepDst.charAt(その数)をくっつけていくほうが、分かりやすいかも。

で、自分の用意した"−"に引っかからなくて困っているのなら、
その時点でelseを取って文字コードを出力してみれば良いのでは?

最後に、文字列を再構築するならStringBuilder#append()をおすすめします。
まあ、10文字程度では大した違いはないですが。
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-12 09:11
mioさんご意見ありがとうございます。

>とかやっといて、repSrcのindexOfが-1ならそのまま、0以上ならrepDst.charAt(その数)を>くっつけていくほうが、分かりやすいかも。

これなら最初にエンコードしてそれからindexofした方が良くないですか?
でもエンコードして?になることもあるんですよね...

ぼくの作りでは最初に必ず置換するので前記述した形で問題は無いと思ってます。
あとは一文字目と最後にindexofで調べて、あればフォーマットエラーという事で
甘いかもしれませんが、最低限の入力チェック(正規表現チェックをするべきですね)
はできていると思います。

ただ記述は16進数が正しいようですね、他の方も見るなら一般的なほうに合わせた方が
いいですね。

ところでStringBuilder?StringBufferじゃないですか?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-06-12 09:31
>これなら最初にエンコードしてそれからindexofした方が良くないですか?
エンコードというのは、全角→半角変換のことなんでしょうか?
エンコードとコンバートは違うものですが。
その全角→半角変換のところを、コードの直接指定でない書き方にできないかな、ということです。

>ところでStringBuilder?StringBufferじゃないですか?
Javaのバージョンが1.4以下なら、StringBufferで正解です。
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2006-06-12 09:54
引用:

その全角→半角変換のところを、コードの直接指定でない書き方にできないかな、ということです。


えーと、単純に「マジックナンバーをそのまま使用したくない(可読性が悪いから)」ってだけですよね。
ならば、「定数宣言を行なう」のが一般的な方法だと思いますけど。

コード:
/** 全角ラテン文字文字 開始 */
private static final char FULL_WIDTH_LATIN_START = 0xff01;
/** 全角ラテン文字文字 終了 */
private static final char FULL_WIDTH_LATIN_END = 0xff5e;
....
if (code >= FULL_WIDTH_LATIN_START && code <= FULL_WIDTH_LATIN_END) { 


ってな感じで。
※判断には「等号」が必要なはずです。(<,>→NG <=, >= →OK)
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-12 10:30
みなさん、ありがとうございます。

>エンコードというのは、全角→半角変換のことなんでしょうか?
>エンコードとコンバートは違うものですが。
>その全角→半角変換のところを、コードの直接指定でない書き方にできないかな、ということです。

いえいえ、文字置換とは違うエンコードです。
といっても普段は気にしたことも無かったので、できるかどうか疑問ですが、
どんな文字列でも、indexofの前に統一するという事で、Shift_JISならShift_JISで
明示的にエンコードを必ずかけると言う意味でした。
そうでなくとも?に置き換わったので正しい方法とは言えませんが..

やっぱりchar型で取り出し、半角ハイフンのそれぞれの文字型の整数で比較するのが
安全だと思いました。

ありがとうございます。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2006-06-12 11:58
エンコード云々の話ですか?
単純に
半角ハイフン(-)と半角長音(ー)の2つの文字コードがあるだけではないですか?
間違っていたらごめんなさい。
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2006-06-12 12:50
引用:

かんぱちさんの書き込み (2006-06-12 10:30) より:
みなさん、ありがとうございます。

>エンコードというのは、全角→半角変換のことなんでしょうか?
>エンコードとコンバートは違うものですが。
>その全角→半角変換のところを、コードの直接指定でない書き方にできないかな、ということです。

いえいえ、文字置換とは違うエンコードです。
といっても普段は気にしたことも無かったので、できるかどうか疑問ですが、
どんな文字列でも、indexofの前に統一するという事で、Shift_JISならShift_JISで
明示的にエンコードを必ずかけると言う意味でした。
そうでなくとも?に置き換わったので正しい方法とは言えませんが..

やっぱりchar型で取り出し、半角ハイフンのそれぞれの文字型の整数で比較するのが
安全だと思いました。

ありがとうございます。



エンコード云々のお話はおいといて...


「文字型の整数」では無く「文字コード」で考えた方が良くないですか?
例えば、「文字「0」のUnicodeってなんだっけ?」と言うときには、文字コード表を調べて「0x0030」ということが分かりますよね?
で、それを(わざわざ)10進変換して「48」としても良いんですが、その状態のソースを後からメンテナンスする人が見ると、
「文字コードの10進表記値の48って、16進表記すると何だ?」という事で、わざわざ16進変換して「0x0030」ということが分かり、その値から文字コード表を調べて文字「0」で有ることが分かる。

って事で、10進←→16進の変換が無駄だと思うんですが....
如何でしょうか?
かんぱち
ベテラン
会議室デビュー日: 2006/06/01
投稿数: 73
投稿日時: 2006-06-12 14:50
これほど意見をいただけるとは思いませんでした、ありがとうございます。

>「文字型の整数」では無く「文字コード」で考えた方が良くないですか?
>例えば、「文字「0」のUnicodeってなんだっけ?」と言うときには、文字コード表を調べて>「0x0030」ということが分かりますよね?

10進数というのもあるんですよね、正直この文字コードと整数の知識が薄いんです。
サンプルソースでchar型で文字を一文字一文字取り出してchar型にしてるのも、
僕自身これで文字コードは関係ない一意の整数が算出されるのだろうと想像してのであり、
とりあえず、電話番号の自動置換・書式チェックは達成されているのでOKと考えてます。


KOXさん、それがぼくがテストしてる環境では違うものに置換されていまして、
ここで質問した次第です。
デバッグで見ると確かに半角ハイフンなんですが、文字列比較のequalsでtrueにならない
現象が発生しました。
前述のchar型の8722,45それです。
置換処理では"-"で45の方をセットしていたはずなんですが...
前述のソースは、置換はエンコードが掛かる可能性があるものと前提として、
作ったソースです。

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