- PR -

固定長データの符号付数値の読み込み

1
投稿者投稿内容
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2006-08-09 21:58
テキストファイルに記載された固定長データを読み込む処理を作っています。
数値には+・−の符号がついてしかも「+00001000」「-00001000」という状態です。
小数点のない数値はLong型にて受け取ることになっています。
あらゆる都合により符号の排除ができず、このまま読み込むしかないのですが、
マイナスは普通に読み込めたのですが、プラスがNumberFormatExceptionとなります。
String型で取込⇒Long型変換も失敗に終わってしまいました。
いい手段はないのでしょうか。

分かりづらい文章で申し訳ございません。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-08-09 22:35
自力でStringの先頭の'+'と'-'を切り取ってから数値部分だけを
longに変換して'-'のときは-1を掛けてやればよいのでは?

java.text.DecimalFormatをつかえばすんなりいくのかもしれませんね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-08-09 22:52
引用:

あるさんの書き込み (2006-08-09 21:58) より:
数値には+・−の符号がついてしかも「+00001000」「-00001000」という状態です。
小数点のない数値はLong型にて受け取ることになっています。


どう試されたのかを書かれたほうが、良いと思います。おそらく Long.parseLong あたりを試されたのかもしれませんが、仕様をみると "+" は受け付けない、と書かれていますね。
ならば、と、
コード:
public class Hoge {
    public static void main(String[] args) {
        String a = "+" + Long.MAX_VALUE;
        System.out.println("a = " + a);
        long x = (long) Double.parseDouble(a);
        System.out.println("x = " + x);
    }
}


とやると、
コード:
a = +9223372036854775807
x = 9223372036854775807


となったので、これで成功、と思ったのですが、
コード:
public class Hoge {
    public static void main(String[] args) {
        String a = "-" + Long.MAX_VALUE;
        System.out.println("a = " + a);
        long x = (long) Double.parseDouble(a);
        System.out.println("x = " + x);
    }
}


とやると、
コード:
a = -9223372036854775807
x = -9223372036854775808


となり、失敗でした。
極限まで精度を追求することはできないみたいです。
桁数が小さくてよいなら、だいたいこれで間に合うとは思いますが。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2006-08-10 02:21
引用:

どう試されたのかを書かれたほうが、良いと思います。おそらく Long.parseLong あたりを試されたのかもしれませんが、仕様をみると "+" は受け付けない、と書かれていますね。


すみません、試したことを書くべきでした。
察しの通りで、parseLongとvalueOfで試してみたのですが、よく考えると
同じことをしてました。。。。

もう少し色々試してダメならお二方のアドバイスで行ってみようと思います。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2006-08-10 12:17
DecimalFormatクラスのJavaDocがわかりやすくないんですよね。

コード:
        DecimalFormat df = new DecimalFormat("+00000000;-00000000"); //符号付8桁
        Number n;
        try {
            n = df.parse("-00001000");
            System.out.println(n.longValue());
        } catch (ParseException e) {
        }


さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-08-10 15:20
java.util.Scanner を使えば簡単にできます。

# Tiger からしか使えないのですが ^^;;
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2006-08-11 11:48
皆さん、返答有難うございます。
StringをBigDecimalで受け取ってLongに変換という下記のような方法になりました。
小数点付き数値はBigDecimalで受け取るように決まっていたらしく、使えるものは
使ってしまおうと。

  public static void main(String[] args) {
    
    long l;
    String s = "+" + Long.MAX_VALUE;
    String s2 = "-" + Long.MAX_VALUE;
    BigDecimal bd;
    
    try{
      
      bd = new BigDecimal(s);
      l = bd.longValue();
      System.out.println("S =:" + s);
      System.out.println("S→long =:" + l);
      
      bd = new BigDecimal(s2);
      l = bd.longValue();
      System.out.println("S2 =:" + s2);
      System.out.println("S2→long=:" + l);
      
    }catch(NumberFormatException e){
      System.err.println("---------------------------------------------");
      e.printStackTrace();
      System.err.println("---------------------------------------------");
    }
  }


(納期まで決められていたのに新人用のサンプルコードだとは思わなかった・・・
仕様が口頭で伝えられ、しかも大雑把過ぎたのはそのせいか・・・)
1

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