diff --git a/DESCRIPTION b/DESCRIPTION index 0afa22a..eaca709 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,13 +1,13 @@ Package: common Type: Package Title: chepec common -Version: 0.0.1.9000 +Version: 0.0.1.9001 Description: Commonly used functions and scripts. Authors@R: person("Taha", "Ahmed", email = "taha@chepec.se", role = c("aut", "cre")) License: GPL-3 Encoding: UTF-8 LazyData: TRUE -RoxygenNote: 6.1.1 +RoxygenNote: 7.1.1 Imports: stats, knitr, diff --git a/NAMESPACE b/NAMESPACE index 551f938..379adcf 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,6 +15,7 @@ export(as.radians) export(int2padstr) export(is.wholenumber) export(molarity2mass) +export(numbers2swedish) export(numbers2words) export(pascal2torr) export(roundup) diff --git a/R/common.R b/R/common.R index dc7d887..52b2598 100644 --- a/R/common.R +++ b/R/common.R @@ -101,7 +101,7 @@ numbers2words <- function(x, billion = c("US", "UK"), and = if (billion == "US") opts <- options(scipen = 100) on.exit(options(opts)) ones <- c("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine") - teens <- c("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", " seventeen", "eighteen", "nineteen") + teens <- c("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen") names(ones) <- names(teens) <- 0:9 tens <- c("twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety") names(tens) <- 2:9 @@ -113,3 +113,61 @@ numbers2words <- function(x, billion = c("US", "UK"), and = if (billion == "US") x <- round(x) if (length(x) > 1) sapply(x, helper) else helper(x) } + + +#' numbers2swedish +#' +#' Converts a number into its corresponding words in Swedish +#' This is my own adaptation of numbers2words() +#' I think an even neater solution would be to have an argument +#' numbers2words(lang = "swe"), but that would require more coding +#' THIS FUNCTION NEEDS WORK +#' Cannot return proper grammar: "en miljon" and "ett tusen", or +#' "en miljon" and "två miljoner", and so on. +#' +#' @param x number +#' +#' @return string +#' @export +numbers2swedish <- function(x) { + and <- "" + trim <- function(text) { + gsub("(^\ *)|((\ *|-|,\ noll|-noll)$)", "", text) + } + makeNumber <- function(x) as.numeric(paste(x, collapse = "")) + makeDigits <- function(x) strsplit(as.character(x), "")[[1]] + helper <- function(x) { + negative <- x < 0 + x <- abs(x) + digits <- makeDigits(x) + nDigits <- length(digits) + result <- if (nDigits == 1) as.vector(ones[digits]) + else if (nDigits == 2) + if (x <= 19) as.vector(teens[digits[2]]) + else trim(paste(tens[digits[1]], "-", ones[digits[2]], sep="")) + else if (nDigits == 3) { + tail <- makeNumber(digits[2:3]) + if (tail == 0) paste(ones[digits[1]], "hundra") + else trim(paste(ones[digits[1]], trim(paste("hundra", and)), + helper(tail))) + } else { + nSuffix <- ((nDigits + 2) %/% 3) - 1 + if (nSuffix > length(suffixes) || nDigits > 15) + stop(paste(x, "is too large!")) + pick <- 1:(nDigits - 3 * nSuffix) + trim(paste(helper(makeNumber(digits[pick])), suffixes[nSuffix], helper(makeNumber(digits[-pick])))) + } + if (negative) paste("minus", result) else result + } + opts <- options(scipen = 100) + on.exit(options(opts)) + ones <- c("noll", "ett", "tv\U00E5", "tre", "fyra", "fem", "sex", "sju", "\U00E5tta", "nio") + teens <- c("tio", "elva", "tolv", "tretton", "fjorton", "femton", "sexton", "sjutton", "arton", "nitton") + names(ones) <- names(teens) <- 0:9 + tens <- c("tjugo", "trettio", "fyrtio", "femtio", "sextio", "sjuttio", "\U00E5ttio", "nittio") + names(tens) <- 2:9 + # https://sv.wikipedia.org/wiki/Namn_p%C3%A5_stora_tal + suffixes <- c("tusen,", "miljoner,", "miljarder,", "biljoner,") + x <- round(x) + if (length(x) > 1) sapply(x, helper) else helper(x) +} diff --git a/README.md b/README.md index 6fdcf17..6a624cf 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ Includes common numerical functions and some LaTeX-specific functions. -Note that the package is named `common`, despite the repository having a different name. +Note that the package is named `common`, despite the repository being name `R-common`. +Sorry about that (this was one of the very first packages I created, and I haven't +gotten around to fixing the naming mismatch yet). -[This repository is mirrored on my Gitea](https://git.chepec.se/taha/common). +[This repository is mirrored on my Gitea](https://git.solarchemist.se/taha/common). diff --git a/man/GenericXtableSetAttributes.Rd b/man/GenericXtableSetAttributes.Rd index 6e0743c..9483be2 100644 --- a/man/GenericXtableSetAttributes.Rd +++ b/man/GenericXtableSetAttributes.Rd @@ -4,9 +4,15 @@ \alias{GenericXtableSetAttributes} \title{Set the attributes for a generic xtable object} \usage{ -GenericXtableSetAttributes(xtobject, nxtnames = NULL, nxtdigits = NULL, - nxtdisplay = NULL, nxtalign = NULL, caption.text = "nxtcaption", - caption.label = "tab:nxtlabel") +GenericXtableSetAttributes( + xtobject, + nxtnames = NULL, + nxtdigits = NULL, + nxtdisplay = NULL, + nxtalign = NULL, + caption.text = "nxtcaption", + caption.label = "tab:nxtlabel" +) } \arguments{ \item{xtobject}{the xtable (table)} diff --git a/man/SubfigureGenerator.Rd b/man/SubfigureGenerator.Rd index 1d59996..42a9136 100644 --- a/man/SubfigureGenerator.Rd +++ b/man/SubfigureGenerator.Rd @@ -4,8 +4,14 @@ \alias{SubfigureGenerator} \title{Generate LaTeX subfigure code} \usage{ -SubfigureGenerator(images, subcaptions, mainlabel = "fig:mainfig", - perpage = 6, ncol = 2, landscape = FALSE) +SubfigureGenerator( + images, + subcaptions, + mainlabel = "fig:mainfig", + perpage = 6, + ncol = 2, + landscape = FALSE +) } \arguments{ \item{images}{vector with full paths to images (png-files or other LaTeX-compatible format) diff --git a/man/numbers2swedish.Rd b/man/numbers2swedish.Rd new file mode 100644 index 0000000..4770949 --- /dev/null +++ b/man/numbers2swedish.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/common.R +\name{numbers2swedish} +\alias{numbers2swedish} +\title{numbers2swedish} +\usage{ +numbers2swedish(x) +} +\arguments{ +\item{x}{number} +} +\value{ +string +} +\description{ +Converts a number into its corresponding words in Swedish +This is my own adaptation of numbers2words() +I think an even neater solution would be to have an argument +numbers2words(lang = "swe"), but that would require more coding +THIS FUNCTION NEEDS WORK +Cannot return proper grammar: "en miljon" and "ett tusen", or +"en miljon" and "två miljoner", and so on. +} diff --git a/man/numbers2words.Rd b/man/numbers2words.Rd index fdac64f..53ce41f 100644 --- a/man/numbers2words.Rd +++ b/man/numbers2words.Rd @@ -4,8 +4,11 @@ \alias{numbers2words} \title{numbers2words} \usage{ -numbers2words(x, billion = c("US", "UK"), and = if (billion == "US") "" - else "and") +numbers2words( + x, + billion = c("US", "UK"), + and = if (billion == "US") "" else "and" +) } \arguments{ \item{x}{number}