- ベストアンサー
足し算するプログラム
タイトルの通りですが足し算をするプログラムを書いてみました。 第一引数を第二引数を足し算するのですが引数に「001」や「002」などの数字が入力された時に足し算した結果として素直に「00*」と足し算が出来ません。何かいい方法は無いでしょうか?教えてください。 import java.text.*; class Tashizan { public static void main(String[] args) { try { if(args.length == 0) { System.out.println("引数を整数値で入力して下さい。"); } else if(args.length == 1) { System.out.println("引数を整数値で2つ入力して下さい。"); } else if(args.length == 2) { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); if(a <= 999999999 && b <= 999999999) { int wa = a + b; System.out.println(a + "+" + b + "の和は" + wa + "です。"); } else { System.out.println("入力した桁数を9桁以下か確認してください。"); } } else { System.out.println("引数は整数値で2つ入力して下さい。"); } } catch(NumberFormatException nfe) { System.out.println("整数値を2つ入力して下さい。"); } catch(Exception e) { System.out.println(e + "エラー発生!処理を終了します。"); } } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
たとえば、"001"と"002"という「文字列」を指定した場合に、 それをparseIntで、「数値」である1と2に変換しているわけなので、 (足し算をするためには当然そうしなければならないのですが) 「素直な結果」ということなら、「数値」の3ということになるでしょう。 そこを"003"という結果がほしいのであれば、「数値」である3から "003"という「文字列」を作って返さねばなりません。 頭をゼロ埋めして桁数をそろえるのはもちろん可能ですが、 ここで問題となってくるのは、それを何桁にするかということです。 たしかに"001"と"002"なら直感的に"003"かな?と思いますが、 ・"001"と"0002"だったらどう返せばいいのか? (2つのパラメータが同じ桁数とはかぎっていない) ・"888"と"999"だったらどう返せばいいのか? (同じ桁数だからといって答えも同じ桁数とはかぎらない) こういったパターンを洗い出し、何桁にするかルールを決めて、 桁数をそろえる処理はそのあとということになりますね。
その他の回答 (2)
- neuron-x
- ベストアンサー率52% (139/266)
簡単なテストケースを作ってみました。 add() メソッドが実際の計算を行っているメソッドです。これにargs[0]、args[1]などを渡して結果を取得すると良いでしょう。(当然、予期しない文字列が渡されたときは例外のハンドリングを行いましょう) ちなみに、CommonsのStringUtilsを使っています。 http://jakarta.apache.org/commons/ ソースコード(表示を見やすくするため、タブを全角スペースで置き換えています) ---------------------------------------------------------------------- import junit.framework.TestCase; import org.apache.commons.lang.StringUtils; public class AddTest extends TestCase { /** 桁数 */ public static final int FIGURE = 3; /** テストケース */ public void testAddString() throws Exception { AddTest at = new AddTest(); assertEquals(at.add("000", "000"), "000"); assertEquals(at.add("010", "000"), "010"); assertEquals(at.add("000", "010"), "010"); assertEquals(at.add("001", "002"), "003"); assertEquals(at.add("100", "200"), "300"); try { at.add("abc", "xyz"); fail(); // 例外が発生しないと失敗. } catch (Exception e) { // Success. } } /** * 文字列で渡された値の足し算を行い、結果を返す。 * * @param lhs 値1 (e.g. "001") * @param rhs 値2 (e.g. "002") * @return 足し算した結果. FIGUREの桁数で0埋め. */ public String add(String lhs, String rhs) { // 左の0を取り除く (e.g. "001" to "1") String strLhs = StringUtils.stripStart(lhs, "0"); String strRhs = StringUtils.stripStart(rhs, "0"); int nLhs = 0; int nRhs = 0; // 0を取り除いた文字列を数字に変換 (e.g. "1" to 1) // ただし、全てが0の場合は処理を行わない。 if (!StringUtils.isBlank(strLhs)) nLhs = Integer.parseInt(strLhs); if (!StringUtils.isBlank(strRhs)) nRhs = Integer.parseInt(strRhs); int nAns = nLhs + nRhs; // 足し算結果の左に0を入れて返す. (e.g. 3 to "003") String strAns = Integer.toString(nAns); return StringUtils.leftPad(strAns, FIGURE, "0"); } }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
意味がもう一つわからないんですが、3桁にするために0を補うということでしょうか? 例えば、 System.out.println(a + "+" + b + "の和は" + zeroFormat(wa,3) + "です。"); … static String zeroFormat(int x, int size){ String v=Integer.toString(x); int len=v.length(); for(int i=0;i<size-len;i++) v="0"+v; return v; } とかしたらどうでしょう
補足
説明不足で申し訳ありません。 例で言いますと・・・ >java Tashizan 001 001 001+001の和は002です。 というプログラムにしたいのですが。
お礼
回答ありがとうございます。 何桁にするか・・・ってことで DecimalFormatクラスを利用して 桁数を10桁にすることで出来ました。 DecimalFormat df = new DecimalFormat("0000000000"); こんな感じで。