• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:数値にウエイトをかけたい)

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

このQ&Aのポイント
  • 数値にウエイトをかける方法は、個々の数値を分解し、左から順番にウエイトをかけることです。
  • 具体的には、与えられた数値を文字列として扱い、文字列を個々の数値に分解します。
  • そして、ウエイトを掛けた値を分割後の文字列格納変数に保存します。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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

ITJack
質問者

お礼

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

ITJack
質問者

補足

アドバイスどうもありがとうございます。 やりたいことは以下のようになります。 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 ); で計算できないのかと思ったのですが・・・

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね? 文字列だからsubstringメソッドで1文字取り出すことが簡単にできます 対し、weightは整数です。 特定の桁の数字を取り出すなら、計算が必要です。 目的の桁が一の位になるように10のべき乗で割る。端数切り捨て →10で割った余りが目的の数。 ですが、面倒なので、#1で提案した様な方法がいいのでは。  divisions[i] = division * (i); はただ変数i倍するだけで、weightは無関係になります

ITJack
質問者

お礼

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

ITJack
質問者

補足

>divisonは文字列valueからi番目の文字を取り出して、数字→longに変換したものですよね? そうです。 なるほど。そういう事でしたか。 最後に1点だけご質問させて頂きますが モジュラス11のサンプルコードをチェックした際に 下記のような計算式 //divisions[i] = division * (i % 6 + 2);で 配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると なってたのですが この計算方法 divisions[i] = division * (i % 6 + 2);で なぜ配列の添え字が偶数のときは1を掛けて奇数のときは3を掛けると 書くのか理解できないのですが この計算式で合ってますでしょうか??

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Informixで文字列を数値型に

    こんにちは。 当方、Linux7.3+アプリケーション(DB:Informix)を使用しています。 文字列を数値に変換するSQLに悩まされています。 内容 01/01/08からなる文字列と20080101と手動入力される数値を比較する事が最終目標です。 当方が試みている方向は、 01/01/08をSUBSTRING()で20080101に成型し、数値比較をしたい、と思っています。 SUBSTRING()で、文字列型で20080101までできるのですが、数値型にCASTが出来ません。 検討した関数は、下記の通りですが、構文エラーとなり、実装できません。 お助け下さい。 CAST(20080101) as INTEGER TO_NUMBER(20080101) INT(20080101) CONVERT(20080101)

  • 数値を文字列として結合した結果を数値に変換する

    お世話になっております。 プログラムで、文字を結合した結果を数値に変換する処理にて 処理を高速化できる記述方法があるか質問させてください。 ・やりたいこと  複数の数値を文字列として結合した結果を数値型に高速で変換したい。 ・現在のコード(考え方 C#にて)  今、以下のように数値変換しているのですが、  これ以外の書き方で、スマートな方法はないでしょうか?  ※結果がわかりやすいように変数はその都度宣言しています。 int i1 = "10"; int i2 = "2"; string sConcat = i1.ToString() + i2.ToString() ; // "102" // To Int int convertedInt = int.Parse( sConcat ) ; //102 // To Hex int convertedHex = Convert.ToInt32( sConcat , 16 ); // 0x102 数値を文字にして結合して・・・またキャストというのが 無駄なような気がしています。 すみませんが、良い方法があればご教授ください。

  • C#で数値を抽出したい

    0,2,3,3,5,6, という文字列があったとしまして、これを左の数値からint型配列にひとつひとつ格納したいのですが、どうやればいいかわかりません。 int[0]=0 int[1]=2 ... int[5]=6 どなたか教えてください!

  • ■int型の数値から数字文字への変換について

    はじめまして。専門学生のhide1978と申します。 今回、以下のような問題に取り組んでいるのですが、どうしても正しい結果が得られません。どなたか知恵を授けてやってください。よろしくお願いいたします。 ■問題 int型の数値(-32767から32767)を入力して、そのまま10進文字列(char型)として変換する。 ■私が書いたプログラム #include <stdio.h> int NUMtoCHAR(int c){ if(c >= 0 && c <= 9) return (c+'0'); else return c; } void main(void){ signed int i_value; int count, i; double f_value; char c[9]; printf("入力データ:");scanf("%d",&i_value); printf("\n"); for(i = 0; i < 9; i++) c[i] = ' '; if(i_value > 0){ c[0] = '+'; }else if(i_value < 0){ c[0] = '-'; } f_value = (double)i_value; count = 0; while(f_value >= 1){ f_value = f_value / 10.0; count++; } if(count == 0){ c[2] = '0'; }else{ for(i = 2; count > 0 && i < 9; count--, i++){ f_value = f_value * 10.0; i_value = f_value; c[i] = NUMtoCHAR(i_value); f_value = f_value - i_value; } } printf("10進文字 = "); for(i = 0; i < 9; i++) printf("%c", c[i]); printf("\n"); } 上記プログラムを実行して、入力データとして[32767]を入力すると、結果が[32766]となってしまいます。同じように[34]を入力すると[33]という結果になります。 elseの中に入れ子になっているfor文が怪しいということまでは判るのですが、どのように修正してよいか判りません。 大変長い質問で恐縮ですが、よろしくお願いいたします。 ■環境 OS:WindowsXP Compiler:Borland C++ 5.5.1 fowWin32

  • 数値を2進数文字列に変換するものなんですが・・・

    数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

  • 1から9までの数値をランダムに発生させたい

    ●質問の主旨 INT関数及びRND関数を使い、「0から9」までの 数値をランダムに発生させるのではなく、「1から9」 までの数値をランダムに発生させるには、下記のコードを どのように書き換えれば良いでしょうか? ●質問の補足 下記コード及び画像のように九九の計算問題を 作成したいと思っています。今のコードでは 「0から9」までの数値が発生するのは、分かっていたので If ThenステートメントやSelect Caseステートメントを 使って、0の数値が発生するときは「1」とみなすというような 記述もしてみましたが、上手くいきませんでした。 ご存知のかたよろしくお願いします。 なお使用機種はWindowsVista、Excel2007を使用しています。 私はVBAをはじめて3カ月程度です。 ●コード Option Explicit Const ORG_RW As Integer = 4 '問題の開始行 Const DST_RW As Integer = 8 '問題の終了行 Const NUM1_CLM As Integer = 1 '問題の数値1の列 Const NUM2_CLM As Integer = 3 '問題の数値2の列 Const ANSW_CLM As Integer = 5 '問題の解答の列 Private Sub CommandButton1_Click() 'Checkボタン Dim i As Integer 'カウンタ変数 For i = ORG_RW To DST_RW'問題の開始行から問題の終了行まで If Cells(i, NUM1_CLM).Value * Cells(i, NUM2_CLM).Value = Cells(i, ANSW_CLM).Value Then Cells(i, ANSW_CLM).Font.Color = vbBlue '問題が正解のときは文字が青色 Else Cells(i, ANSW_CLM).Font.Color = vbRed '問題が正解のときは文字が赤色 End If Next i End Sub Private Sub CommandButton2_Click() 'Resetボタン Dim i As Integer 'カウンタ変数 For i = ORG_RW To DST_RW Cells(i, ANSW_CLM).ClearContents '解答が消去される Cells(i, ANSW_CLM).Font.Color = vbBlack '解答が消去されたときは文字が黒色 ' 解答が消去されたときは0~9までのランダムな数値が発生     Cells(i, NUM1_CLM).Value = Int(Rnd * 10) '解答が消去されたときは0~9までのランダムな数値が発生 Cells(i, NUM2_CLM).Value = Int(Rnd * 10) Next i End Sub

  • 文字列から数値への変換

    セルの書式設定(表示形式タブ)で文字列を数値に変えるのと、 VALUE関数で文字列を数値に変えるのとでは何か違いがありますか? (excel2000です。)

  • 文字列数値化

     ちょっとした事情によりint型で作った数字の文字列をC言語で数値化する方法を教えてください。 よろしくお願いします。

  • 文字変換マクロについて

    数値を文字列に変換するマクロで、行数や列数が増えても対応できるようにしたいです。 (並びは…数値 スペース 文字列)どなたか教えてください。 よろしくお願いします。 Sub 文字() Dim i As Long For i = 1 To Range("A1").End(xlDown).Row Cells(i, "C") = Cells(i, "A") With Cells(i, "C") .NumberFormatLocal = "@" .Value = StrConv(Cells(i, "C").Value, vbNarrow) .Value = Format(Cells(i, "C").Value, "'00") End With Next i End Sub

  • 数値の算出について。

    文字列の数値の合計を算出したいのですが マイナスの値があると、算出出来ません。 例 0000001 0000002 -001 とこういった3つの文字列があった場合 各値をint型に戻して総和を算出しようとしたいの ですが、マイナスの値があると エラーが発生します。 どなたかアドバイスお願いします。

    • ベストアンサー
    • Java