なんかできたよー。

Web系Tipsを適当につづるBlog.

アプリのバージョンの比較について関数を作ってみた。

前回のおはなし

一つ前の記事 iOSアプリ起動時にアップデートを知らせてApp Storeへ移動する では「アプリのバージョン」が「1.1」とか「2.1」とか単純に数値として大きいか小さいかで判別していました。

よく考えてみたら、、、バージョンの表記って「1.0.1」とか「12.0.4」とか値が3桁以上の場合が多いし、出来ればそういうのを扱いたいです。

参考にしたサイト

一度自分でやってみたんですが間違ってたみたいなので 「javascript - How to compare software version number using js? (only number) - Stack Overflow」 を参考にCoffeeScriptに書き直しました

コード

# 関数

compare = (installed, update)->
  a = installed
  b = update
  return 0  if a is b

  _a = a.split '.'
  _b = b.split '.'
  len = Math.min _a.length, _b.length

  i = 0
  while i < _a.length
    _a[i] = parseInt _a[i], 10
    ++i

  i = 0
  while i < _b.length
    _b[i] = parseInt _b[i], 10
    ++i

  i = 0
  while i < len
    ###
    if i is 0
      return -99 if _a[i] < _b[i]
    else if i is 1
      return -9  if _a[i] < _b[i]
    ###
    return 1  if _a[i] > _b[i]
    return -1 if _a[i] < _b[i]
    i++

  return 1  if _a.length > _b.length
  return -1 if _a.length < _b.length
  return 0

 
# 今回、調べた値

console.log compare '1', '2'
console.log compare '2', '1'
console.log compare '1.0', '1.0'
console.log compare '1.0', '2.0'
console.log compare '2.0', '1.0'
console.log compare '1.0', '1.0.1'
console.log compare '1.0.1', '1.0'
console.log compare '1.0.1', '1.1.1'
console.log compare '1.1.1', '1.0.1'
console.log compare '9.0.1', '0.1.0.1'
console.log compare '0.1.0.1', '9.0.1'
console.log compare '9.0.1', '10.0.1'

 

戻り値

戻り値 比較 デフォルト
1 if a > b 大きい ok
-1 if a < b 小さい ok
0 if a === b 等しい ok
-99 if a[1] < b[1] 小さい(1つめの値)
-9 if a[2] < b[2] 小さい(2つめの値)

 
基本的には「大きい」、「小さい」、「等しい」の比較になりますが、コメント「###」を外してあげればより詳細(-99, -9)な値が返ってきます。

  i = 0
  while i < len
    if i is 0
      return -99 if _a[i] < _b[i]
    else if i is 1
      return -9  if _a[i] < _b[i]
    return 1  if _a[i] > _b[i]
    return -1 if _a[i] < _b[i]
    i++

 

比較結果

a b 比較 通常 -99, -9あり
'1' '2' 小さい -1 -99
'2' '1' 大きい 1 1
'1.0' '1.0' 等しい 0 0
'1.0' '2.0' 小さい -1 -99
'2.0' '1.0' 大きい 1 1
'1.0' '1.0.1' 小さい -1 -1
'1.0.1' '1.0' 大きい 1 1
'1.0.1' '1.1.1' 小さい -1 -9
'1.1.1' '1.0.1' 大きい 1 1
'9.0.1' '0.1.0.1' 大きい 1 1
'0.1.0.1' '9.0.1' 小さい -1 -99
'9.0.1' '10.0.1' 小さい -1 -99

 

最後に

-99 だったら、、、アップデート通知(強制)
-9 だったら、、、アップデート通知(スキップ化)
-1 ,0 ,1 だったら、、、特に何もしない

って言うのをしようと思ったので書きました。
比較がおかしかったら教えて下さい。(。-_-。)