[#48190] [ruby-trunk - Feature #9816] 文字列内の数字を数値として比較するメソッド — zn@...
Issue #9816 has been updated by Kazuhiro NISHIYAMA.
3 messages
2014/05/08
[ruby-dev:48196] Re: [ruby-trunk - Feature #9816] [Assigned] 文字列内の数字を数値として比較するメソッド
From:
KOSAKI Motohiro <kosaki.motohiro@...>
Date:
2014-05-09 02:22:59 UTC
List:
ruby-dev #48196
Feature#5861 の時と違って、色々とバックグランドの話が提示されたので私は説得されました。
+1
> + def test_numericcmp
> + assert_equal(-1, "2.1.0".numericcmp("2.1.1"))
> + assert_equal(-1, "2.1.9".numericcmp("2.1.10"))
> + assert_equal( 0, "a1".numericcmp("a1"))
> + assert_equal( 1, "aa".numericcmp("a1"))
> + assert_equal(-1, "a1".numericcmp("aa"))
> + assert_equal(-1, "a1".numericcmp("a01"))
> + assert_equal(-1, "a0001".numericcmp("a00001"))
ここちょっと不思議なんですけど、辞書順だと後者が小さくなって、数値だと同値だと思うのですが、
なんで前者が小さくなるべきなんでしょうか。どこかのファイラーだとそうなってるということ?
あと、ふなばさんの指摘が気になっているので、バージョン文字列以外に想定しているユースーケースが
あれば教えて下さい。
> + assert_equal( 0, "a1a".numericcmp("a1a"))
> + assert_equal( 1, "a1b".numericcmp("a1a"))
> + assert_equal(-1, "a9a".numericcmp("a10a"))
> + assert_equal( 1, "b".numericcmp("a"))
> + assert_equal( 0, "\u30421".numericcmp("\u30421"))
> + assert_equal( 1, "\u3042\u3042".numericcmp("\u30421"))
> + assert_equal(-1, "\u30421".numericcmp("\u3042\u3042"))
> + assert_equal(-1, "\u30421".numericcmp("\u304201"))
> + assert_equal(-1, "\u30420001".numericcmp("\u304200001"))
> + assert_equal( 0, "\u30421\u3042".numericcmp("\u30421\u3042"))
> + assert_equal( 1, "\u30421\u3044".numericcmp("\u30421\u3042"))
> + assert_equal(-1, "\u30429\u3042".numericcmp("\u304210\u3042"))
> + assert_equal( 1, "\u3044".numericcmp("\u3042"))
> + end
> +
> def test_upcase2
> assert_equal("\u3042AB", "\u3042aB".upcase)
> end
> ```