2014-12-18 2 views

ответ

6

Вы можете использовать cl-format из clojure.pprint, который является реализация Common Lisp довольно обширный и очень мощный format

user=> (cl-format nil "The answer is ~,,' :D" 123456789) 
"The answer is 123 456 789" 

CL-х cl-format имеет, как обычный Clojure format, несколько директив, здесь D для цифр. Модификатор : сообщает ему печатать запятые между группами цифр, однако ' за второй запятой указывает использование пробела в качестве символа-запятой для использования.

+0

Спасибо. Увлекательно найти новую мощную функцию в Clojure. Я прочитал документацию. 1. Двойные запятые выглядят немного странно. Что это значит? 2. Также будет работать нижний регистр 'd'. Любая разница? – Nick

+0

И можно ли добавить символ новой строки в конце, как \ n? Я хочу напечатать несколько номеров в каждой строке. – Nick

+0

Долгий ответ был бы очень долгим, поэтому лучший короткий ответ, который у меня есть, - это прочитать немного через связанную документацию CLHS «format». Я бы порекомендовал вам прочитать основные параметры, а затем взглянуть на примеры. [Формат раздела «Практический общий Лисп» Питера Сейбела] (http://www.gigamonkeys.com/book/a-few-formatreces.html) также может послужить хорошим введением. Он также имеет ответ о том, как печатать несколько значений из списка/последовательности. Обратите внимание, что вы должны преобразовать код CL в Clojure. :-) – schaueho

2

Я не уверен, что это лучший способ, однако, вы можете благополучно замените , пространством. В любом случае, после форматирования числа это просто строка.

(clojure.string/replace (format "%,d" (BigInteger. "fffff" 16)) "," " ") 

Я пытался использовать java.text.DecimalFormat, и установить разделитель группировки с помощью метода setGroupingSeparator из java.text.DecimalFormatSymbols, но не удалось.

+0

спасибо. Я рассматриваю это как последнее средство (но оно все еще работает.) – Nick

1

не думаю, что это возможно используя java.util.Formatter (это то, что clojure.core/format в конечном счете использует). Код ниже, однако, даст желаемый результат:

(import 'java.text.DecimalFormatSymbols 
     'java.text.DecimalFormat 
     'java.text.FieldPosition) 

(defn format-bigint [i] 
    (let [format (DecimalFormatSymbols.) 
     out (StringBuffer.)] 
    (.setGroupingSeparator format \space) 
    (.format (DecimalFormat. ",###" format) i out (FieldPosition. java.text.NumberFormat/INTEGER_FIELD)) 
    (.toString out))) 
+0

Спасибо за ваши усилия! Вы также можете взглянуть на ответ @ schaueho. То есть: функция clojure.pprint/cl-format. – Nick

Смежные вопросы