0

アプリケーションにリビジョン番号属性があり、それは単なる文字列です。現在の値を渡し、次の有効な値を計算して返す必要があります。

有効な進行は次のとおりです。

.A
.B
.C
0
0.A
0.B
1
1.A
etc

他の場所で制御されている整数は忘れてください。これはピリオドのあるものだけを扱います。制限事項は次のとおりです。

  • 最初のコンポーネントは常に数値です (または何もありません)。
  • その後、ピリオド
  • 次に、I と O を除く文字 (1 と 0 に似ているため) で、Z に到達すると、AA、AB、AC、...、ZZ に移動する必要があります。

そう

If I pass in .A it should return .B
If I pass in 1.H it should pass back 1.J
If I pass in 1.Z it should pass back 1.AA

どんな助けでも大歓迎です。

これが私が持っているものです-文字部分を「インクリメント」する方法がわかりません:

function calcNextRev(currentRev)
{
var revParts = currentRev.split(".");
var majorRev = revParts[0];
var currentMinorRev = revParts[1];

???

return majorRev + "." + newMinorRev;
}
4

2 に答える 2

2

基本的に、あなたがしていることは、基数24ではありますABCDEFGHJKLMNPQRSTUVWXYZが、「通常の」の代わりに数字として使用すること0123456789ABCDEFGHIJKLMNOです。そこで、JavaScript のあまり知られていない機能を使用して、基数 10 以外の数値をparseInt(value,base)andの形式で処理しvalue.toString(base)ます。

var letters = "ABCDEFGHJKLMNPQRSTUVWXYZ".split(""), 
    base24_to_letters_map = {}, 
    letters_to_base24_map = {};

// Build maps from base 24 digits to desired range of letters and vice versa
for (var i=0; i<24; i++) {
    base24_to_letters_map[i.toString(24)] = letters[i];
    letters_to_base24_map[letters[i]] = i.toString(24).toUpperCase();
}

// Convert each digit in "val" based on "map"
function convert (val, map) {
    return val.replace(/[0-9A-Z]/g, function(chr) { return map[chr]; });
}

function increment (version) {
    var base24, number;

    base24 = convert (version, letters_to_base24_map);  // convert "BJ" to "1A"
    number = parseInt (base24, 24);                     // convert "1A" to 34
    number++;                                           // increment
    base24 = number.toString (24);                      // convert 35 to "1B"
    version = convert (base24, base24_to_letters_map);  // convert 1B to BK

    return version;
}

これにより、3 文字以上のバージョン番号が「無料」で提供されます。「ZZ」は「AAA」になります。さらに、任意の数のバージョンを前後に簡単にジャンプできます。

先頭の数字のバージョン番号を処理するには:

full_version.replace(/[A-Z][A-Z]?/, function (letter_portion) {
    return increment (letter_portion);
});
于 2013-07-22T03:09:42.590 に答える