こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

数値にウエイトをかけたい

1つずつ分解した数値に対して
左から順番にウエイト(234512345123451)を
かけたいのですが
下記の
divisions[i] = division * (i);に加える
計算式が分かりません。
アドバイスお待ちしてます。

value = reverse(value);
int maxlength = value.length();

String checkDigitValue = null;
long modulus11 = 11;
long  Weight = 234512345123451l;

// 分割後の文字列格納変数
long divisions[] = new long[maxlength];

// 文字列を個々の数値に分解し、ウェイトを掛ける
for (int i = 0; i < maxlength; i++) {

long division = 0;
division = Long.parseLong(value.substring(i, i+1));


 divisions[i] = division * (i);

}

投稿日時 - 2012-10-26 13:59:55

QNo.7767070

すぐに回答ほしいです

質問者が選んだベストアンサー

> long  Weight = 234512345123451l;

の意味がよくわかりません。
valueの一文字目 → longに変換 → Weightの(10進)最上位2と掛ける
ってことですか?
もしそうなら、valueの用に文字列にして[division = Long.parseLong(~」と同じようにするとか、
1つずつ配列にするとかすればいいのでは?

投稿日時 - 2012-10-26 21:59:30

補足

アドバイスどうもありがとうございます。

やりたいことは以下のようになります。

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 );で計算できないのかと思ったのですが・・・

投稿日時 - 2012-10-27 23:28:41

お礼

下記のようなソースで
文字列を添え字で分割して
ウエイトをかける方式に
切り替えて何とか出来ました。
アドバイスどうもありがとうございました。

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);
}

投稿日時 - 2012-11-01 11:23:52

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね?
文字列だからsubstringメソッドで1文字取り出すことが簡単にできます

対し、weightは整数です。
特定の桁の数字を取り出すなら、計算が必要です。

目的の桁が一の位になるように10のべき乗で割る。端数切り捨て
→10で割った余りが目的の数。

ですが、面倒なので、#1で提案した様な方法がいいのでは。

 divisions[i] = division * (i);
はただ変数i倍するだけで、weightは無関係になります

投稿日時 - 2012-10-28 20:03:17

補足

>divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね?

そうです。
なるほど。そういう事でしたか。


最後に1点だけご質問させて頂きますが

モジュラス11のサンプルコードをチェックした際に
下記のような計算式
//divisions[i] = division * (i % 6 + 2);で
配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると
なってたのですが
この計算方法
divisions[i] = division * (i % 6 + 2);で
なぜ配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると
書くのか理解できないのですが
この計算式で合ってますでしょうか??

投稿日時 - 2012-10-29 16:33:56

お礼

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;
}

投稿日時 - 2012-10-29 22:25:33

あなたにオススメの質問