Convert numbers to cardinal character vectors (one, two, three)

cardinal(x, max_n = Inf, negative = "negative", ...)

nom_card(x, max_n = Inf, negative = "negative", ...)



A numeric vector


A numeric vector. When the absolute value of x is greater than max_n, x remains numeric instead of being converted to words. If max_n is negative, no xs will be converted to words. (This can be useful when max_n is passed by another function.) Defaults to Inf, which converts all xs to words.


A character vector to append to negative numbers. Defaults to "negative".


Arguments passed on to fracture::frac_mat


If denom is not NULL, all fractions will have a denominator of denom. This will ignore all other arguments that affect the denominator.


If TRUE, all denominators will be a power of 10.


If TRUE, all fractions will have the same denominator.

If the least common denominator is greater than max_denom, max_denom is used.


All denominators will be less than or equal to max_denom.

If base_10 is TRUE, the maximum denominator will be the largest power of 10 less than max_denom.

A max_denom greater than the inverse square root of machine double epsilon will produce a warning because floating point rounding errors can occur when denominators grow too large.


A character vector of the same length as x


Decimal components of x are automatically converted to fractions by fracture::frac_mat().

See also

uncardinal() to convert character vectors to numbers

Other number names: adverbial(), collective(), denominator(), numerator(), ordinal(), ratio()


#> [1] "two"
#>  [1] "one"   "two"   "three" "four"  "five"  "six"   "seven" "eight" "nine" 
#> [10] "ten"  
nom_card(2 + 4/9)
#> [1] "two and four ninths"
#> [1] "negative two"
nom_card(-2, negative = "minus")
#> [1] "minus two"

nom_card(5:15, max_n = 10)
#>  [1] "five"  "six"   "seven" "eight" "nine"  "ten"   "11"    "12"    "13"   
#> [10] "14"    "15"   

paste("There are", nom_card(525600), "minutes in a year.")
#> [1] "There are five hundred twenty-five thousand six hundred minutes in a year."
paste("There are", nom_card(3.72e13), "cells in the human body.")
#> [1] "There are thirty-seven trillion two hundred billion cells in the human body."

nom_card(1 / 2^(1:4))
#> [1] "one half"      "one quarter"   "one eighth"    "one sixteenth"
nom_card(1 / 2^(1:4), common_denom = TRUE)
#> [1] "eight sixteenths" "four sixteenths"  "two sixteenths"   "one sixteenth"   
nom_card(1 / 2^(1:4), base_10 = TRUE)
#> [1] "five tenths"                            
#> [2] "twenty-five hundredths"                 
#> [3] "one hundred twenty-five thousandths"    
#> [4] "six hundred twenty-five ten-thousandths"
nom_card(1 / 2^(1:4), base_10 = TRUE, common_denom = TRUE)
#> [1] "five thousand ten-thousandths"                 
#> [2] "two thousand five hundred ten-thousandths"     
#> [3] "one thousand two hundred fifty ten-thousandths"
#> [4] "six hundred twenty-five ten-thousandths"       

nom_card(1 / 2:5)
#> [1] "one half"    "one third"   "one quarter" "one fifth"  
nom_card(1 / 2:5, base_10 = TRUE)
#> [1] "five tenths"                                                                                
#> [2] "three million three hundred thirty-three thousand three hundred thirty-three ten-millionths"
#> [3] "twenty-five hundredths"                                                                     
#> [4] "two tenths"                                                                                 
nom_card(1 / 2:5, base_10 = TRUE, max_denom = 100)
#> [1] "five tenths"             "thirty-three hundredths"
#> [3] "twenty-five hundredths"  "two tenths"