Отформатируйте «числовую» строку как число - PullRequest
0 голосов
/ 02 сентября 2018

Я хотел бы отформатировать 'числовую' строку как 'номер строки' в Clojure. Это маска формата:

"#, ###, ###, ## 0,00"

Учитывая строку "9999,99", я ожидаю получить обратно "9,999,99".

Как бы я сделал это в Clojure, не прибегая к написанию функции конвертера, т.е. используя format или что-то подобное?

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Вы можете сделать это, используя NumberFormat. Мне также нравится другой ответ (см. Java 10 Formatter docs для деталей):

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test)
  (:import [java.text NumberFormat]
           [java.util Locale]))

(dotest
  (let [value (Double/valueOf "1234567.89")
        nf    (NumberFormat/getNumberInstance (Locale/US))
        s1a   (.format nf (.doubleValue value))
        s1b   (format "%,05.2f" value)]
    (spyx s1a)
    (spyx s1b))

s1a => "1,234,567.89"
s1b => "1,234,567.89"

  (let [value (Double/valueOf "1.2")
        nf    (NumberFormat/getNumberInstance (Locale/US))
        s1a   (.format nf (.doubleValue value))
        s1b   (format "%,05.2f" value)]
    (spyx s1a)
    (spyx s1b)))

s1a => "1.2"
s1b => "01.20"

Обновление

Вот как это сделать для BigDecimal, используя сначала взаимодействие с Java, а затем встроенную функцию Clojure bigdec:

(format "%,05.2f" (BigDecimal. "9999999999999999.12")) => "9,999,999,999,999,999.12"
(format "%,05.2f" (bigdec      "9999999999999999.12")) => "9,999,999,999,999,999.12"
0 голосов
/ 02 сентября 2018

Похоже, что в вашей проблемной области недостатки и ограничения двоичной базы с плавающей запятой (например, IEEE-754) вызывают у вас некоторые трудности. Возможно, вам следует рассмотреть возможность использования поддержки BigDecimal, уже встроенной в Clojure. В Clojure разница между константой BigDecimal и константой с плавающей запятой составляет один символ; например 1.2 - это Double, а 1.2M - это BigDecimal. Функцию bigdec можно использовать для преобразования вещей в BigDecimal на лету. Например,

(format "%,.2f" (bigdec "9999999999999999.12"))

производит

"9,999,999,999,999,999.12"

как и ожидалось. Арифметические функции, такие как *, +, - и /, также работают должным образом.

Однако это не решает вашу основную проблему. Если ваша строка формата не соответствует соглашениям строки формата Java / Clojure, вам нужно написать функцию конвертера.

Удачи.

0 голосов
/ 02 сентября 2018

Вы можете использовать , в спецификаторе формата:

(format "%,.2f" (float (clojure.edn/read-string "9999")))
=> "9,999.00"
(format "%,.2f" (Double/parseDouble "9999.126"))
=> "9,999.13"

Обновление для включения bigdec пример:

(format "%,.2f" (bigdec "9999999999999999.12"))
=> "9,999,999,999,999,999.12"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...