मैं DecimalFormat वर्ग खोजने के (और Grails के formatNumber टैग विस्तार से) कुछ उपयोग के मामलों के लिए अपारदर्शी एक सा है, और मैं अभी भी कुछ बहुत करने के लिए एक उचित तरीका नहीं मिला है उचित स्वरूप स्ट्रिंग उत्पन्न करने के लिए कुछ बदसूरत प्री-प्रोसेसिंग के बिना इसके साथ मूल स्वरूपण। मैंने कई महीनों पहले एक साधारण संख्या स्वरूपण टैग को एक साथ फेंक दिया जो अनिवार्य रूप से एक प्रारूप स्ट्रिंग बनाता है और कुछ न्यूनतम प्रक्रिया को स्वयं ही करता है।
यह सामान्य या सुरुचिपूर्ण नहीं है जैसा कि मैं चाहता हूं (यह उस समय की आवश्यकता है - यह बहुत ही बुनियादी है, लेकिन यह अभी भी जीएसपी से कुछ बदसूरत प्रसंस्करण रखता है), लेकिन इसे पढ़ना आसान होना चाहिए, और यह स्पष्ट जहां इसे छोटा रूप से सुधार किया जा सकता है (यानी बेवकूफ अगर बदले के बदले स्केलिंग पुनरावर्तक बनाते हैं, तो उपयोगकर्ता को कस्टम स्केलिंग मार्करों में पास करने की इजाजत मिलती है, जो एक पैरामीटर के रूप में कस्टम नंबर सत्यापनकर्ता की इजाजत देता है)।
// 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
}
}
स्रोत
2009-09-01 02:25:52
@ankimal - दूसरों पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है - आप की कोशिश की है:
http://www.grails.org/Contribute+a+Tag#remotePaginate
जैसी है कुछ प्रकार की कमी, या आपका कस्टम टैग सिर्फ कुछ कार्य के लिए उपयुक्त है? –