## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
has_arrow <- requireNamespace("arrow", quietly = TRUE) &&
  requireNamespace("tibble", quietly = TRUE)
knitr::opts_chunk$set(eval = has_arrow)
# arrow can be built without Parquet support.
has_parquet <- has_arrow && arrow::arrow_with_parquet()

## ----echo = FALSE, eval = !has_arrow, comment = NA----------------------------
# message("The arrow package is not available; code output is not shown.")

## ----setup--------------------------------------------------------------------
library(decimal)

## -----------------------------------------------------------------------------
a <- arrow::Array$create(
  c("100.05", "99999999999999999999.99", "0.01")
)$cast(arrow::decimal128(25, 2))
a

## -----------------------------------------------------------------------------
format(as.vector(a), digits = 22)

## -----------------------------------------------------------------------------
as_decimal(a)

## -----------------------------------------------------------------------------
whole <- arrow::Array$create(c("1", "2"))$cast(arrow::decimal128(9, 2))
as_decimal(whole)
attr(as_decimal(whole), "scale")

## -----------------------------------------------------------------------------
as_decimal(a, scale = 4)

## -----------------------------------------------------------------------------
as_decimal(arrow::Array$create(c("1.50", NA, "2.25"))$cast(arrow::decimal128(9, 2)))

## -----------------------------------------------------------------------------
cs <- arrow::ChunkedArray$create(
  arrow::Array$create(c("1.25", "2.50"))$cast(arrow::decimal128(9, 2)),
  arrow::Array$create("3.75")$cast(arrow::decimal128(9, 2))
)
cs$num_chunks
as_decimal(cs)

## -----------------------------------------------------------------------------
as_decimal(arrow::Array$create("9007199254740993")$cast(arrow::int64()))

## -----------------------------------------------------------------------------
x <- decimal::decimal(c("1.25", "2.50", "-3.75"))
a <- arrow::as_arrow_array(x)
a$type

## -----------------------------------------------------------------------------
as.vector(a)

## -----------------------------------------------------------------------------
arrow::as_arrow_array(x, type = arrow_decimal_type(20, 2))$type

## -----------------------------------------------------------------------------
arrow::as_arrow_array(x, type = arrow::decimal128(20, 2))$type

## ----error = TRUE-------------------------------------------------------------
try({
arrow::as_arrow_array(x, type = arrow::decimal128(2, 2))
})

## -----------------------------------------------------------------------------
tab <- arrow::arrow_table(
  id = 1:3,
  amount = decimal::decimal(c("100.05", "0.01", "12.30"))
)
tab$schema$GetFieldByName("amount")$type$ToString()
tibble::as_tibble(as.data.frame(tab))

## ----eval = has_parquet-------------------------------------------------------
path <- tempfile(fileext = ".parquet")
arrow::write_parquet(tab, path)
arrow::read_parquet(path)$amount

t2 <- arrow::read_parquet(path, as_data_frame = FALSE)
t2$schema$GetFieldByName("amount")$type$ToString()
as_decimal(t2$amount)

## ----include = FALSE, eval = has_parquet--------------------------------------
unlink(path)

## -----------------------------------------------------------------------------
foreign <- arrow::arrow_table(
  id = 1:2,
  amount = arrow::Array$create(
    c("100.05", "99999999999999999999.99")
  )$cast(arrow::decimal128(25, 2))
)
tibble::as_tibble(arrow_as_data_frame(foreign))

## -----------------------------------------------------------------------------
types <- vapply(foreign$schema$fields, function(f) f$type$ToString(), character(1))
names(foreign)[grepl("^decimal", types)]

## ----error = TRUE-------------------------------------------------------------
try({
arrow::as_arrow_array(decimal::decimal(c("1.50", "NaN")))
})

## -----------------------------------------------------------------------------
big <- decimal::decimal(
  c("12345678901234567890.12345678", "0.10000000000000000001"),
  scale = 20
)
arrow::infer_type(big)

## ----error = TRUE-------------------------------------------------------------
try({
arrow::infer_type(decimal::decimal(strrep("9", 90)))
})

## -----------------------------------------------------------------------------
as_decimal(arrow::as_arrow_array(big))

## -----------------------------------------------------------------------------
tens <- decimal::decimal(c("12300", "4500"), scale = -2)
arrow::infer_type(as_decimal(tens, scale = 0))

