2013-03-21 2 views
0

Что я сделал не так:Groovy цифровой строки сравнить

assert 'foo' == 'foo' //PASS 
assert '500' == '500' //PASS 
assert '500' < '1000' //FAIL <-- Supposed to pass 
assert '500' <= '1000' //FAIL <-- Supposed to pass 
assert '1000' > '500' //FAIL <-- Supposed to pass 
assert '1000' >= '500' //FAIL <-- Supposed to pass 

Это для настраиваемого "состояния" объекта:

class Condition { 
    static def compareClosure = [ 
      '==' : { a, b -> a == b}, 
      '!=' : { a, b -> a != b}, 
      '<' : { a, b -> a < b}, 
      '<=' : { a, b -> a <= b}, 
      '>' : { a, b -> a > b}, 
      '>=' : { a, b -> a >= b} 
    ] 

    String comparator 
    def value 

    Condition(String comparator, String value) { 
     this.value = value 
     this.comparator = comparator 
    } 

    boolean isSatisfiedBy(def value) { 
     compareClosure[comparator](value, this.value) 
    } 
} 

Так

assert new Condition('<=', '1000').isSatisfiedBy('500') //FAIL 

Есть ли способ сделать это без преобразования значения в числовой тип?

+0

Является ли это использовать при заказе? –

+0

http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-one-built-in –

+0

Я добавил дополнительную информацию. Это не для целей назначения – Thermech

ответ

0

Короткий ответ на ваш вопрос: нет.

Однако у меня такое чувство, что это касается сортировки. Если это так. Вот функция сортировки, которую я использую для этой цели.

Пример в действии: Groovy Web Console

Closure customSort = { String a, String b -> 
     def c = a.isBigDecimal() ? new BigDecimal(a) : a 
     def d = b.isBigDecimal() ? new BigDecimal(b) : b 


     if (c.class == d.class) { 
     return c <=> d 
     } else if (c instanceof BigDecimal) { 
     return -1 
     } else { 
     return 1 
     } 

    } 

['foo','500','1000', '999', 'abc'].sort(customSort) 
+0

Спасибо, это было не для этой цели. Я отредактировал свой вопрос с дополнительной информацией. – Thermech

+0

Вместо того, чтобы полагаться на исключения, используйте [String.isInteger()] (http://groovy.codehaus.org/groovy-jdk/java/lang/String.html#isInteger%28 % 29): 'c = a.integer? a.toInteger(): a' – OverZealous

+0

Спасибо - не знал, что было там –

Смежные вопросы