grails smart substring方法 - 即使结束索引越界也能正常工作

时间:2014-02-25 17:28:41

标签: grails

我的域名中有很多'描述'属性。这些可能会很长。我想将描述的前n个字符放入域类的toString()中。大。但是在执行期间,如果字符串是< n在一个propertName.substring(0,n) - 它吹一个垫片 - 索引超出范围。

问:我最有效的解决方法是什么?考虑添加域类属性方法或字符串类方法,smartSubString(start,end,ifNullOrEmpty)如果长度为<将返回完整长度。结束,如果它为空或为null,则返回第3个可选参数中指定的内容,默认为空字符串。

我将非常感谢其他建议和细节,如何放置此方法,如什么文件夹,以及如何将其包含在grails中。

谢谢!

2 个答案:

答案 0 :(得分:2)

String.metaClass.subStringWithDefault = {init, last, defaultVal = null ->
    delegate ? delegate[init..(delegate.size() > last ? last : -1)] : defaultVal
}

def string = 'This is a test String'

assert string.subStringWithDefault(0, 5, 'default') == 'This i'
assert string.subStringWithDefault(0, 50,'default') == 'This is a test String'
assert string.subStringWithDefault(7, 50,'default') == ' a test String'
assert string.subStringWithDefault(7, 50) == ' a test String'
assert string.subStringWithDefault(7, 10,'default') == ' a t'
assert ''.subStringWithDefault(0, 50,'default') == 'default'

我会将此实用程序作为src/groovy类的一部分放在StringUtils中,并在Bootstrap中启动。

//src/groovy
class StringUtils {
    static initUtils(){
        smartSubString()
    }

    static smartSubString() {
        String.metaClass.subStringWithDefault = {init, last, defaultVal = null ->
            delegate ? delegate[init..(delegate.size() > last ? last : -1)] : 
                 defaultVal
        }
    }
}

//BootStrap
import static com.example.mypackage.StringUtils

def init = {
    initUtils()
}

答案 1 :(得分:1)

我将这样的方法放在src / groovy中的实用程序类中:

package com.foo.bar

class Utils {
   static String safeSubstring(String s, int maxLength) {
      s ? s[0..(Math.min(maxLength - 1, x.length() - 1))] : ''
   }
}

并在域类中将其称为

import com.foo.bar.Utils

...

String toString() {
   Utils.safeSubstring propertyName, 5
}