有一个最喜欢的自定义Grails标签?

6 grails

我一直在我的项目中使用标签.我在grails.org上浏览自定义标签,为我的库找到一些新标签.

http://www.grails.org/Contribute+a+Tag

我想知道StackOverflow社区中的人是否有他们想要分享的最喜欢的自定义标签.

Chr*_*ing 1

我发现 DecimalFormat 类(以及 Grails 的 formatNumber 扩展标记)对于某些用例来说有点不透明,而且我仍然没有找到一种合理的方法来使用它进行一些非常基本的格式化,而无需进行一些丑陋的预处理来生成适当的格式细绳。几个月前,我拼凑了一个简单的数字格式化标签,它本质上构造了一个格式字符串并对数字本身进行了一些最小的处理。

它不像我想要的那样通用或优雅(这就是我们当时所需要的——它是超级基本的,但它仍然保留了一些丑陋的处理不受 GSP 的影响),但它应该易于阅读,而且很明显它可以在哪里得到微不足道的改进(即使缩放迭代而不是天真的 if-elseif slop,允许用户传递自定义缩放标记,允许自定义数字验证器作为参数等)。


// Formats a number to 3 significant digits, appending appropriate scale marker
// (k, m, b, t, etc.). Defining var allows you to use a string representation
// of the formatted number anywhere you need it within the tag body, and 
// provides the scale as well (in case highlighting or other special formatting
// based upon scale is desired).
def formatNumberScaled = {attrs, body -> // number, prefix, suffix, invalid, var
    Double number
    String numberString
    String scale

    try {
        number = attrs.'number'.toDouble()
    } catch (Exception e) {
        number = Double.NaN
    }

    if (number.isNaN() || number.isInfinite()) {
        numberString = scale = attrs.'invalid' ?: "N/A"
    } else {
        Boolean negative = number < 0d
        number = negative ? -number : number

        if (number < 1000d) {
            scale = ''
        } else if (number < 1000000d) {
            scale = 'k'
            number /= 1000d
        } else if (number < 1000000000d) {
            scale = 'm'
            number /= 1000000d
        } else if (number < 1000000000000d) {
            scale = 'b'
            number /= 1000000000d
        } else if (number < 1000000000000000d) {
            scale = 't'
            number /= 1000000000000d
        }

        String format
        if (number < 10d) {
            format = '#.00'
        } else if (number < 100d) {
            format = '##.0'
        } else {
            format = '###'
        }
        format = "'${attrs.'prefix' ?: ''}'${format}'${scale} ${attrs.'suffix' ?: ''}'"

        numberString = g.formatNumber('number': negative ? -number : number, 'format': format)
    }

    // Now, either print the number or output the tag body with
    // the appropriate variables set
    if (attrs.'var') {
        out << body((attrs.'var'): numberString, 'scale': scale)
    } else {
        out << numberString
    }
}
Run Code Online (Sandbox Code Playgroud)