【最大10000ポイント】当たる!!質問投稿キャンペーン!

住所などに含まれる全角英数字とハイフンを半角へ変換したく、Javaのソースが置いてあるサイトなどを
探したのですが、見つかりませんでした。

このような痒いところに手がとどく
ユーティリティー系のクラスは
どこかにありますでしょうか?
他の言語では標準関数や標準的な物があるのですが、
Javaでないのは、簡単に作れる為なのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 Unicodeでいわゆる全角文字のAからZは0xFF21から0xFF3Aに、aからzは0xFF41から0xFF5Aに、


0から9は0xFF10から0xFF19に割り当てられています。
半角文字のAからZは0x0041から0x005Aに、aからzは0x0061から0x007Aに、0から9は0x0030から0x0039に割り当てられています。
この関係で変換すればよいと思います。
以下がその例です。
ハイフン(に見える)文字は何種類かありますので、調べられたもののみで対応しました。

public class halfchar {

private static final byte HyphenBytes[] =
{ 0x22, 0x12, 0x00, 0x2D, 0x20, 0x10, 0x30, (byte)0xFC, (byte)0xFF, 0x0D };

public static void main(String args[]) {

String Str, HyphenStr;
char Chr;
StringBuffer StrBuff = new StringBuffer();
byte b[];
int i, j, HyphenLen;

try {

HyphenStr = new String(HyphenBytes, "UTF-16BE");
HyphenLen = HyphenStr.length();

for (i = 0; i < args[0].length(); i ++) {

Chr = args[0].charAt(i);
Str = Character.toString(Chr);

if (Str.matches("[[A-Z][a-z][0-9]]")) {
b = Str.getBytes("UTF-16BE");
b[0] = 0;
b[1] += (byte)0x20;
StrBuff.append(new String(b, "UTF-16BE"));
}

else {
for (j = 0; j < HyphenLen; j ++)
if (HyphenStr.charAt(j) == Chr) break;
if (j == HyphenLen) StrBuff.append(Chr);
else StrBuff.append("-");
};

};

System.out.println(StrBuff.toString());

} catch (Exception e) { System.out.println(e.toString()); };

};

}
    • good
    • 0

Javaの中で全角英数字という表現がそもそもおかしいかもしれません。


Unicodeの0~9、A~Z、a~z、-をASCIIにしたいだけであれば、16進数表記した際の頭の00を取り除くだけだと思いますがいかがでしょうか。
    • good
    • 0
この回答へのお礼

超クールな方法を教えていただきありがとうございます。文字コード体系を生かした方法という発想は全くありませんでした。大変参考になりました。

お礼日時:2003/05/12 21:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列から数字を取り出す方法

質問があります。
例えば、テキストファイルから文章を一行ずつ読み込み、それをString型の変数に格納していきます。
その文から数字(整数で、何桁かはわからない。)を取り出し(ちなみにその数字の前後には特定の文字がついています)、変数に格納するというプログラムを作りたいのですが、具体的な方法がわかりません。
よろしければ是非教えてください!

Aベストアンサー

こんな感じですか?
数値以外を除きそのまま代入させます

String str = "ABCDABCD1234512345abcd";
int ret = Integer.parseInt(str.replaceAll("[^0-9]",""));
System.out.println(ret); //結果表示

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

Q整数の桁数が取得できません

Javaで整数の桁数を取得するには、以下の方法しかないのでしょうか?

int num = 123;
// の桁数3を取得するには
int keta = Integer.toString(num).length;

Aベストアンサー

No.1の方の回答で取得できます。
ただlogを使うと重くなる(処理が遅くなる)との声もあるようです。(参考URL参照)
ちなみにこんな方法でも取得できます。

while(0<num){
num /= 10;
keta++;
}

ただこの方法ですとループが終わった(桁数が取得できた)後、
numの値が0になっていますので、numの値は必ず別の変数に
保持しておいてください。

ちなみに私はいつもmatchoriさんの方法で桁数取得しています。
それでは!

参考URL:http://www.vc-net.ne.jp/~ytp/bbs/java/bbs6333.html

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q全角スペースのチェックについて

こんにちは。

全角スペースについてのご質問です。

ある入力項目に対して必須チェックを行っております。
下記のコードはServlet内で以下のチェックを行っております。

----------------------------------------------------------------
String name = req.getParameter("name");
bean.setName(name);

if(bean.name().trim().length() == 0 || bean.name() == null){
return NO_INPUT_ERR;
}
----------------------------------------------------------------

このチェックでは半角スペース『 』であればエラーとして判断してくれますが、
全角スペース『 』ではエラーとして判断してくれません。
(全角スペースはtrim()を実行しても省いてくれないため)

全角スペース『   』の判断をする場合は、
新規にクラスを作成して文字数分繰り返しチェックを入れるような処理を
自分で作成しないとチェックは出来ないのでしょうか?

ご存知の方がおりましたら、ご教授の程お願い致します。

こんにちは。

全角スペースについてのご質問です。

ある入力項目に対して必須チェックを行っております。
下記のコードはServlet内で以下のチェックを行っております。

----------------------------------------------------------------
String name = req.getParameter("name");
bean.setName(name);

if(bean.name().trim().length() == 0 || bean.name() == null){
return NO_INPUT_ERR;
}
----------------------------------------------------------------

このチェックでは半角...続きを読む

Aベストアンサー

>自分で作成しないとチェックは出来ないのでしょうか?

作っちゃえばいいんじゃないですか?

また使う機会はあるでしょうし、無駄にはならないでしょ。

考えてるよりその方が早いと思います。

もしくは、チェックだけなら、

bean.name().trim().replaceAll(" ", "").length() == 0

としてしまう手もありますけど。


ところで、

if(bean.name().trim().length() == 0 || bean.name() == null){

の部分ですが、条件の評価は後ろからですっけ?

前から評価するのだとしたら、

bean.name() == null

は無意味ですね。

評価する前に、例外が発生してしまいます。

Qflush()とclose()について

Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

Aベストアンサー

フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね?

で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。

そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、

・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。
・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。

とまぁ、目的も内容も全然違うわけです。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

Qeclipseでjavadocコメント自動挿入の設定を教えてください。

eclipse3.1.1でstrutsでの開発を行っています。

右クリック→ソース→GetterおよびSetterの生成

で、Getter、Setterの自動生成は出来ますが
「~を設定します」みたいなjavadocコメントが
自動で挿入されなくなってしまいまいた。

eclipseでgetter,setterを自動生成した際にjavadoc
コメントを自動生成する設定を教えてください。
よろしくお願いします。

Aベストアンサー

ウインドウ→設定→JAVA→コードスタイル→コードテンプレートに編集画面がありますが、ここが消えてるとか?
違ってたらごめんなさい


人気Q&Aランキング