3

C#では、長い値を「サブストリング」する(より適切な単語がないため)ための最良の方法は何ですか。

トレーラーレコードのアカウント番号の合計を計算する必要がありますが、必要なのは最下位16文字だけです。

値を文字列に変換することでこれを行うことができますが、それを行うためのより良い方法があるかどうか疑問に思いました。

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;

if (number > _MAX_LENGTH)
{
  string strNumber = number.ToString();
  number = Convert.ToInt64(strNumber.Substring(strNumber.Length - 16));
}

これにより、値4567890123456789が返されます。

4

3 に答える 3

8

あなたができること:

long number = 1234567890123456789L;
long countSignificant = 16;
long leastSignificant = number % (long) Math.Pow(10, countSignificant);

これはどのように作動しますか?ええと、10で割ると、最後の桁が減りますよね?そして、残りはその最後の桁になりますか?同じことが100、1000、およびにも当てはまりMath.Pow(1, n)ます。

頭の中でこれを行うことができるので、最下位桁を見てみましょう。

1234を10で割ると、123の余り4になります。

C#では、次のようになります。

1234 / 10 == 123;
1234 % 10 == 4;

したがって、次のステップは、有効数字の最後のn桁を取得する方法を理解することです。これは、10をnの累乗で割ったものと同じであることがわかります。c#には(Pythonのように)指数演算子がない**ため、ライブラリ関数を使用します。

Math.Pow(10, 4) == 1000.0; // oops: a float!

それを長いものに戻す必要があります。

(long) Math.Pow(10, 4) == 1000;

これで、独自の優れた機能を作成するためのすべての要素が揃ったと思います;)

于 2012-05-11T08:16:12.030 に答える
7

モジュロ(%C#の演算子)を使用できます。例えば:

123456 % 100000 = 23456

また

123456 % 1000 = 456

クイックガイドとして、除数のゼロと同じ数の桁を取得することを覚えています。または、その逆の場合、除数には、桁を保持したい数のゼロが必要です。

したがって、あなたの場合、あなたは必要になるでしょう:

long number = 1234567890123456789L;
long divisor = 10000000000000000L;
long result = number % divisor;
于 2012-05-11T08:16:34.640 に答える
1

完全なコード、モジュロ演算子を使用します。

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;

number = number % (_MAX_LENGTH + 1);                

Console.WriteLine (number);

ライブテスト: http: //ideone.com/pKB6w


モジュロアプローチを理解するまでは、当面は代わりにこれを選択できます。

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;


if (number > _MAX_LENGTH) {             
    long minus = number / (_MAX_LENGTH +  1) * (_MAX_LENGTH +  1);              
    number = number - minus;
}

Console.WriteLine(number);

ライブテスト: http: //ideone.com/oAkcy


ノート:

強くお勧めします。モジュロアプローチを使用し、減算は使用しないでください。モジュロアプローチが最適であり、コーナーケースはありません。つまり、ifステートメントを使用する必要はありません。

于 2012-05-11T08:36:45.733 に答える