From: KOSAKI Motohiro Date: 2014-05-08T22:22:59-04:00 Subject: [ruby-dev:48196] Re: [ruby-trunk - Feature #9816] [Assigned] 文字列内の数字を数値として比較するメソッド 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 > ```