- ベストアンサー
数値にウエイトをかけたい方法
- 数値にウエイトをかける方法は、個々の数値を分解し、左から順番にウエイトをかけることです。
- 具体的には、与えられた数値を文字列として扱い、文字列を個々の数値に分解します。
- そして、ウエイトを掛けた値を分割後の文字列格納変数に保存します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> long Weight = 234512345123451l; の意味がよくわかりません。 valueの一文字目 → longに変換 → Weightの(10進)最上位2と掛ける ってことですか? もしそうなら、valueの用に文字列にして[division = Long.parseLong(~」と同じようにするとか、 1つずつ配列にするとかすればいいのでは?
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね? 文字列だからsubstringメソッドで1文字取り出すことが簡単にできます 対し、weightは整数です。 特定の桁の数字を取り出すなら、計算が必要です。 目的の桁が一の位になるように10のべき乗で割る。端数切り捨て →10で割った余りが目的の数。 ですが、面倒なので、#1で提案した様な方法がいいのでは。 divisions[i] = division * (i); はただ変数i倍するだけで、weightは無関係になります
お礼
kmeeさんがおっしゃっている 、#1で提案した様な方法とは下記のようなことでしょうか?? もし違っている場合お手数ですがご指摘ください。 public static String getCheckDigitModulus11(String value,String Weight) { value = reverse(value);//文字列 int maxlength = value.length();//文字列 Weight = reverse(Weight);//ウエイト int Weightlength = Weight.length();//ウエイト String checkDigitValue = null; long modulus11 = 11; // 分割後の文字列格納変数 long divisions[] = new long[maxlength];//文字列 long divisions2[] = new long[Weightlength];//ウエイト // 1チェックデジット対象文字列を個々の数値に分解し、ウェイトを掛ける for (int i = 0; i < maxlength; i++) { long division = 0; division = Long.parseLong(value.substring(i, i+1));//文字列 long division2 = 0; division2 = Long.parseLong(Weight.substring(i, i+1)); // divisionにWeightを掛ける divisions[i] = division * division2; }
補足
>divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね? そうです。 なるほど。そういう事でしたか。 最後に1点だけご質問させて頂きますが モジュラス11のサンプルコードをチェックした際に 下記のような計算式 //divisions[i] = division * (i % 6 + 2);で 配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると なってたのですが この計算方法 divisions[i] = division * (i % 6 + 2);で なぜ配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると 書くのか理解できないのですが この計算式で合ってますでしょうか??
お礼
下記のようなソースで 文字列を添え字で分割して ウエイトをかける方式に 切り替えて何とか出来ました。 アドバイスどうもありがとうございました。 public static String Weight1(String isbn) { Integer[] Weight1 = new Integer[15]; Weight1[0] = Integer.valueOf(isbn.substring(0, 1)); Weight1[1] = Integer.valueOf(isbn.substring(1, 2)); Weight1[2] = Integer.valueOf(isbn.substring(2, 3)); Weight1[3] = Integer.valueOf(isbn.substring(3, 4)); Weight1[4] = Integer.valueOf(isbn.substring(4, 5)); Weight1[5] = Integer.valueOf(isbn.substring(5, 6)); Weight1[6] = Integer.valueOf(isbn.substring(6, 7)); Weight1[7] = Integer.valueOf(isbn.substring(7, 8)); Weight1[8] = Integer.valueOf(isbn.substring(8, 9)); Weight1[9] = Integer.valueOf(isbn.substring(9, 10)); Weight1[10] = Integer.valueOf(isbn.substring(10, 11)); Weight1[11] = Integer.valueOf(isbn.substring(11, 12)); Weight1[12] = Integer.valueOf(isbn.substring(12, 13)); Weight1[13] = Integer.valueOf(isbn.substring(13, 14)); Weight1[14] = Integer.valueOf(isbn.substring(14, 15)); //Weight(1) = //234512345123451 Integer total =( Weight1[0] * 2*2 %11) +(Weight1[1] * 3*2 %11) +(Weight1[2] * 4*2 %11 )+(Weight1[3] * 5*2 %11) +(Weight1[4] * 1*2 %11) +(Weight1[5] * 2*2 %11) +(Weight1[6] * 3*2 %11) +(Weight1[7] * 4*2 %11 )+(Weight1[8] * 5*2 %11) +(Weight1[9] * 1*2 %11) +(Weight1[10] * 2*2 %11) +(Weight1[11] * 3*2 %11) +(Weight1[12] * 4*2 %11) +(Weight1[13] * 5*2 %11 )+(Weight1[14] * 1*2 %11); total = (total % 11); /* 下1桁を11で引く */ String totals = String.valueOf(total); Integer digit = 11 - Integer.valueOf(totals.substring( totals.length() - 1, totals.length())); if (digit == 10) { return "0"; } else if ( digit == 11) { return "0"; } else if ( digit == 1) { return "0"; } else if ( digit == 0) { return "-"; } else { } return String.valueOf(digit); }
補足
アドバイスどうもありがとうございます。 やりたいことは以下のようになります。 Weight 234512345123451に対して long division = 0; division = Long.parseLong(value.substring(i, i+1)); 配列の添え字によって divisions[0]は×2 divisions[1]は×3 divisions[2]は×4 Weightをかけていきたいので divisions[i] = division * (i ); で計算できないのかと思ったのですが・・・