Как изменить формат чисел на индийскую систему счисления в R Shiny?

Я пытаюсь создать панель инструментов в R, используя Shiny, в одном из выходных данных окна значений у меня отображается число. Я хочу изменить форматирование в соответствии с индийской системой счисления. Вывод окна значений в настоящее время показывает число как 123 456 789, и я хочу представить его так: 12,34,56 789.

Пожалуйста, дайте мне знать, если потребуется дополнительная информация, любая помощь будет высоко оценена.


person ABHISHEKK    schedule 27.05.2020    source источник
comment
@ r2evans, не могли бы вы подсказать мне, как это сделать. Если вы можете перечислить шаги, пожалуйста.   -  person ABHISHEKK    schedule 27.05.2020
comment
Я не знаком с индийским форматированием. Как печатаются десятичные дроби? (Я не могу найти для него готовую ссылку, только одну для целых чисел.)   -  person r2evans    schedule 27.05.2020
comment
Десятичные знаки печатаются нормально, по крайней мере, в соответствии с википедией проблема в том, что последние три цифры я взял свобода запросить функцию, это вариант доступности, на мой взгляд, вот ссылка github .com/r-lib/scales/issues/274   -  person Bruno    schedule 27.05.2020
comment
@r2evans Для моего текущего требования я ограничиваю количество значащих цифр справа от десятичной дроби до одной, поэтому то, что у нас есть справа от десятичной дроби, на данный момент не является проблемой. Слева от десятичной дроби я хочу, чтобы форматирование было вида 12,34,56,789. Это помогает объяснить проблему?   -  person ABHISHEKK    schedule 27.05.2020


Ответы (1)


Вот быстрый хак, который позволяет в дальнейшем использовать format для большинства других функций. Единственное вмешательство, которое он делает, это проверка наличия значащих цифр, чтобы гарантировать

format2 <- function(x, ..., big.mark = "", big.interval = c(3L, 2L), decimal.mark = ".") {
  intervene <- (log(abs(x), 10) >= sum(big.interval)) && nzchar(big.mark)
  cl <- match.call()
  cl[[1]] <- substitute(format)
  if (intervene) {
    cl$x <- x %/% 10^big.interval[1]
    cl$big.interval <- big.interval[2]
    bigx <- eval.parent(cl)
    cl$x <- x 
    cl$big.interval <- big.interval[1]
    mostx <- eval.parent(cl)
    mostx <- 
      substr(mostx,
             1L + nchar(x %/% 10^big.interval[1]) +
               trunc(trunc(log(abs(x %/% 10^big.interval[1]), 10L)) / big.interval[1]),
             nchar(mostx))
    return( paste0(bigx, mostx) )
  } else eval.parent(cl)
}

format2(123456789)
# [1] "123456789"
format2(12345, big.mark = ",") # no intervene necessary
# [1] "12,345"
format2(123456789, big.mark = ",")
# [1] "12,34,56,789"
format2(1e6 + pi, big.mark = ",")
# [1] "10,00,003"
format2(1e6 + pi, big.mark = ",", digits = 22)
# [1] "10,00,003.1415926536"
format2(1e6 + pi, big.mark = ",", digits = 22, small.mark = ",")
# [1] "10,00,003.14159,26536"

Отказ от ответственности: я, конечно, не проверял это строго, поэтому вполне возможно, что у него могут быть не охваченные крайние случаи. Пусть покупатель будет бдителен.

person r2evans    schedule 27.05.2020
comment
Отвечает ли это на ваш вопрос? - person r2evans; 27.05.2020