3

開始シリアルから作業して、一連の在庫品目シリアル番号を生成するアルゴリズムが必要です。

たとえば、開始シリアルが でB10S001、3 つの数字が生成された場合、結果は次のようになります。

B10S001
B10S002
B10S003

ただし、開始シリアルが でB10S998、3 つの数字が生成されると、結果は次のようになります。

B10S998
B10S999
B10T000

つまり、数値の数は同じままで、必要に応じて最後のアルファが増加する必要があります。

注 - 最初のシリアル番号の構造がわかりません。任意の長さと、英字と数字の任意の組み合わせを指定できます。

現在使用しているコードは次のとおりです。

public static string IncrementNumber(string pNumber) {
    string newNum = "";
    var match = Regex.Match(pNumber, @"(?<=(\D|^))\d+(?=\D*$)");
    if (match.Success) {
        var number = int.Parse(match.Value) + 1;
        newNum = string.Format(
            "{0}{1}{2}",
            pNumber.Substring(0, match.Index),
            number,
            pNumber.Substring(match.Index + match.Length));
        }
    return newNum;
}

これである程度は理解できますが、先頭のゼロが削除され、アルファは増加しません。正規表現についてあまり知りません (フォーラムの投稿から上記のコードをコピー) - これを達成する方法はありますか?

4

3 に答える 3

1

整数値と文字があることを考えると、ここにあなたがする必要があることのためのいくつかの疑似コードがあります:

fun CreateSerial(value, letter):
  value = value + 1
  if value == 1000:
    letter = letter + 1
    if letter > 'Z':
      letter = 'A'
  if value < 10:
    return "B10" + letter + "00" + value
  else if value < 100:
    return "B10" + letter + "0" + value
  else:
    return "B10" + letter + value

編集: パターン マッチングなしで実行するための擬似コードを次に示します。

fun IncrementSerial(serial):
  IncrementNext(serial, serial.length - 1)

fun IncrementNext(serial, index):
  if index == 0:
    return
  if serial[index - 1] is numeral:
    IncrementNumeral(serial, index - 1)
  else:
    IncrementAlpha(serial, index - 1)

fun IncrementNumeral(serial, index):
  number = serial[index] + 1
  if number > '9':
    number = '0'
    IncrementNext(serial, index - 1)
  serial[index] = number

fun IncrementAlpha(serial, index):
  alpha = serial[index] + 1
  if alpha > 'Z':
    alpha = 'A'
    IncrementNext(serial, index - 1)
  serial[index] = alpha

基本的には文字を末尾からインクリメントし、オーバーフローした場合は文字をリセットして次の文字に進み、各反復でどのタイプか (数値とアルファ) を確認します。

最大シリアル番号に到達すると、単に返されます。オプションで、すべてをリセットすることもできます。

于 2013-01-10T08:52:46.147 に答える
1

紙に長い足し算をするのと同じように、「手で」足し算を実装する必要があります。まず、文字列を数値として扱う必要があります。ここでは、すべての桁が異なる基準になっています。右端から 3 番目の数字は 10 の基数、右端の文字は基数 26、次に基数 10 の 2 つの数字、そしておそらく別の基数 26 の数字です。

これで、右から 1 つずつ数字を増やしていきます。右端の数字を 1 ずつ増やします。オーバーフローがない場合 (つまり、9 から 0 にならなかった場合) は完了です。オーバーフローが発生した場合、桁は 0 に戻り、桁を左にインクリメントする必要があります。

B10S999 に到達すると、右端の桁がインクリメントされ、オーバーフローが発生します。次に、右から 2 番目の桁をインクリメントすると、オーバーフローが発生します。次に、次の桁とオーバーフローを取得します。これで、S がインクリメントされました。次の文字は T であるため、B10T000 が得られます。

B10Z999 に到達してインクリメントすると、4 つのオーバーフローが発生し、最終的に B11A000 になります。

于 2013-01-10T08:58:30.067 に答える
0

すべてのロジックを 1 つのクラスに入れて、それで完了してみませんか? どうやらあなたのシリアルには4つのパーツがあり、

 class Serial{
     Serial(string s);

     char prefixLetter;
     int prefixNum;
     char middleLetter;
     int traillingNum;

     void increment();
     bool isvalid();
     string toString();

     //etc....
 }
于 2013-01-10T09:03:12.800 に答える