#groovy
#groovy
Вопрос:
У меня есть код, подобный :
def a = 2111 - 1112
//which calculates a as 999.
Но в приведенном выше результате мне нужно a
быть таким 0999
, т. е. мне нужны начальные нули в a
. Как я могу это сделать?
Комментарии:
1. Рекомендуемое чтение для строк заполнения: mrhaki.blogspot.de/2009/09/groovy-goodness-padding-strings.html содержит подробную информацию о
string.center(lengthAsInt, padString)
,string.padRight(lengthAsInt, padString)
иstring.padLeft(lengthAsInt, padString)
— также работает без параметра padString
Ответ №1:
Кажется, что должно быть гораздо более простое решение, но это лучшее, что я смог придумать:
Integer.metaClass.sub = {
def padTo = Math.max(delegate.toString().length(), it.toString().length())
return (delegate - it).toString().padLeft(padTo, '0')
}
println 2111.sub(1112)
Я сомневаюсь, что вы действительно хотите изменить поведение оператора «-«, но если вы это сделаете, я думаю, было бы лучше, если бы вы изменили метакласс String.subtract вместо этого и использовали «2111» — «1112»
Комментарии:
1. Хороший ответ, но что
delegate
здесь делает? и почему вы также изменилиmax
функцию? Запутался.2. делегат — это объект, для которого вызывается метод. Я просто использовал Math.max, чтобы определить, сколько нулей необходимо для дополнения числа
3. Вы также можете просто написать метод, который принимает два входных сигнала любого типа и возвращает соответствующий дополненный вывод.
4. @eric 1. опубликовал ваш вариант с параметром по умолчанию и оператором распространения 🙂
Ответ №2:
Решение Groovy-er может быть:
Integer.metaClass.sub = { it, pad=[ "$it", "$delegate" ]*.length().max() ->
"${delegate - it}".padLeft( pad, '0' )
}
println 2111.sub( 1112 ) // default padding
println 2111.sub( 1112, 10 ) // pad to 10 chars
который выведет:
0999
0000000999
Комментарии:
1. Ваш, безусловно, Groovy-er 🙂
2.
pad=[ "$it", "$delegate" ]*.length().max()
в этом коде, как вы вызываетеmax
функцию после вызоваlength
функции? Как это работает?3. Этот код создает список, содержащий 2 строки. Затем он использует оператор spread для вызова length для всех элементов в итак, теперь у нас есть список длин. Затем он вызывает max в этом списке и возвращает самый большой
Ответ №3:
Это решение на Java-y, но для записи требуется всего 1 строка, и это может быть «предполагаемое» использование:
def a = 2111 - 1112
def formatted = String.format("d", a)
println "Number with leading zeroes: " formatted //Prints 0999
Первый аргумент String включает в себя количество цифр, которое вы хотите.
Комментарии:
1. Возможно, это больше похоже на Unix-y решение, которое java приняла для Java 5. Я часто использую эти форматы в Groovy и думаю, что это самый лучший способ.