Есть ли библиотека или функция R для форматирования строк международной валюты? - PullRequest
0 голосов
/ 12 июля 2020

Вот фрагмент данных JSON, с которыми я работаю:

{
   "item" = "Mexican Thing",
   ...
   "raised": "19",
   "currency": "MXN"
},
{
   "item" = "Canadian Thing",
   ...
   "raised": "42",
   "currency": "CDN"
},
{
   "item" = "American Thing",
   ...
   "raised": "1",
   "currency": "USD"
}

Вы поняли.

Я надеюсь, что есть функция, которая может в стандартной аббревиатуре валюты и числом и выплюнуть соответствующую строку. Теоретически я мог бы написать это сам, за исключением того, что я не могу притвориться, будто знаю все тонкости этого материала, и я вынужден проводить дни и недели, удивляясь ошибкам или крайним случаям, о которых я не думал. Я надеюсь, что уже написана библиотека (или, по крайней мере, веб-api), которая может справиться с этим, но мой поиск в Google пока не дал ничего полезного.

Вот пример результата, который я хочу (давайте представим, что "- это функция, которую я ищу)

currency("USD", "32") --> "$32"
currency("GBP", "45") --> "£45"
currency("EUR", "19") --> "€19"
currency("MXN", "40") --> "MX$40"

1 Ответ

0 голосов
/ 12 июля 2020

Если ваш реальный json действителен, это должно быть относительно просто. Я предоставлю действительную строку json, исправив здесь три недопустимые части: = должно быть :; ..., очевидно, является заполнителем; и это должен быть список, обернутый в [ и ]:

js <- '[{
   "item": "Mexican Thing",
   "raised": "19",
   "currency": "MXN"
},
{
   "item": "Canadian Thing",
   "raised": "42",
   "currency": "CDN"
},
{
   "item": "American Thing",
   "raised": "1",
   "currency": "USD"
}]'
with(jsonlite::parse_json(js, simplifyVector = TRUE), 
     paste(raised, currency))
# [1] "19 MXN" "42 CDN" "1 USD" 

Edit : чтобы изменить на указанные c символы валюты, не делайте это слишком сложно: просто создайте экземпляр lookup vector, где "USD" (например) добавляет "$" и "" (ничего) к строке raised. (Я говорю как добавление, так и добавление, потому что я считаю, что некоторые валюты всегда являются пост-цифрами ... Я могу ошибаться.)

pre_currency <- Vectorize(function(curr) switch(curr, USD="$", GDP="£", EUR="€", CDN="$", "?"))
post_currency <- Vectorize(function(curr) switch(curr, USD="", GDP="", EUR="", CDN="", "?"))
with(jsonlite::parse_json(js, simplifyVector = TRUE), 
     paste0(pre_currency(currency), raised, post_currency(currency)))
# [1] "?19?" "$42"  "$1"  

I намеренно оставил "MXN" из vector здесь, чтобы продемонстрировать, что вам нужен параметр по умолчанию, "?" (pre / post) здесь. Вы можете выбрать другое значение по умолчанию / неизвестное значение валюты.

Альтернативный вариант:

currency <- function(val, currency) {
  pre <- sapply(currency, switch, USD="$", GDP="£", EUR="€", CDN="$", "?")
  post <- sapply(currency, switch, USD="", GDP="", EUR="", CDN="", "?")
  paste0(pre, val, post)
}
with(jsonlite::parse_json(js, simplifyVector = TRUE), 
     currency(raised, currency))
# [1] "?19?" "$42"  "$1"  
...