Как я могу вычесть целые числа в Groovy и сохранить начальные нули?

#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 и думаю, что это самый лучший способ.