UP | HOME |

Escritura de números mediante palabras o cifras con R y LaTeX

Uso de cifras o palabras para transcribir números

Son quipus unos memoriales o registros hechos de ramales, en que diversos nudos y diversos colores significan diversas cosas. Es increíble lo que en este modo alcanzaron, porque cuanto los libros pueden decir de historias, y leyes, y ceremonias y cuentas de negocios, todo eso suplen los quipus tan puntualmente, que admiran. – P. José de Acosta S.J.

Quipu, Arica.

En la escritura de documentos surge la duda de si escribir los números mediante cifras o palabras. El Diccionario panhispánico de dudas dicta unas guías de actuación. Sin embargo, la publicación posterior de la Ortografía de la lengua española matiza o modifica dichas normas. En la sección final aparecen diversas correcciones.

Escritura literal con R

Si desea emplear el lenguaje de programación R para escribir números mediante palabras, puede utilizar la función descrita abajo. Si escribe números mediante cifras con LaTeX, el paquete siunitx automatiza el proceso.

Con R, mediante el siguiente código:

source("https://torres.epv.uniovi.es/centon/graphics/escribir-numeros-literales.r")

escribirnumeroenteroliteral(721)                  # "setecientos veintiún"
escribirnumeroenteroliteral(721, uno="uno")       # "setecientos veintiuno"
escribirnumeroenteroliteral(721, masculino=FALSE) # "setecientas veintiuna"
escribirnumeroenteroliteral(987654321,masculino=FALSE) # "novecientas ochenta y siete millones seiscientas cincuenta y cuatro mil trescientas veintiuna"

[1] "setecientos veintiún"
[1] "setecientos veintiuno"
[1] "setecientas veintiuna"
[1] "novecientas ochenta y siete millones seiscientas cincuenta y cuatro mil trescientas veintiuna"

Con LaTeX:

\usepackage{siunitx}

123                \num{123}
1234               \num{1234}
12 345             \num{12345}
0.123              \num{0.123}
0.1234             \num{0,1234}
0.123 45           \num{.12345}
3.45 × 10^{-4}     \num{3.45d-4}
-10^{10}           \num{-e10}
123 456            $123\,456$

En LaTeX para utilizar como separador decimal el punto, hay que incluir la opción es-nodecimaldot con el modo spanish en el paquete babel.

\usepackage[spanish,es-tabla,es-nodecimaldot,es-noshorthands]{babel} % Spanish titles

Uso de cifras o de palabras

(Tomado del Diccionario panhispánico de dudas y modificado según la Ortografía de la lengua española)

La elección de cifras o de palabras en la escritura de los números depende de varios factores: el tipo de texto de que se trate, la complejidad del número que se deba expresar y el contexto de uso. Así, en general, en textos científicos y técnicos es más normal, por su concisión y claridad, el empleo de cifras, y resulta obligado cuando se trata de operaciones matemáticas, cómputos estadísticos, inventarios, tablas, gráficos o cualquier otro contexto en que el manejo de números es constante y constituye parte fundamental de lo escrito. Por las mismas razones de concisión y claridad, en carteles, etiquetas, titulares periodísticos y textos publicitarios es también general el empleo de cifras. Por el contrario, en obras literarias y textos no técnicos en general, resulta preferible y más elegante, salvo que se trate de números muy complejos, el empleo de palabras en lugar de cifras. A este respecto pueden ofrecerse las siguientes recomendaciones generales:

rae-ortografia-numeros.png

Se escribirán preferentemente con letras:

a) Los números que pueden expresarse en una sola palabra, esto es, del cero al veintinueve, las decenas (treinta, cuarenta, etc.) y las centenas (cien, doscientos, etc.): Me he comprado cinco libros: tres ensayos y dos novelas; Este año tengo cincuenta alumnos en clase; A la boda acudieron trescientos invitados.

b) Los números redondos que pueden expresarse en dos palabras (trescientos mil, dos millones, etc.): Acudieron cien mil personas a la manifestación; Ganó tres millones en un concurso.

c) Los números que se expresan en dos palabras unidas por la conjunción y (hasta noventa y nueve): Mi padre cumplió ochenta y siete años la semana pasada; En la Biblioteca de Palacio hay treinta y cinco manuscritos.

No es recomendable mezclar en un mismo enunciado números escritos con cifras y números escritos con letra; así pues, si algún número perteneciente a las clases antes señaladas forma serie con otros más complejos, es mejor escribirlos todos con cifras: En la Biblioteca de Palacio hay 35 manuscritos y 135 226 volúmenes impresos, 134 de ellos incunables.

d) En textos no técnicos es preferible escribir con letras los números no excesivamente complejos referidos a unidades de medida. En ese caso, no debe usarse el símbolo de la unidad, sino su nombre: Recorrimos a pie los últimos veinte kilómetros (no los últimos veinte km). Cuando se utiliza el símbolo, es obligado escribir el número en cifras (→ 1.2d).

e) Todos los números aproximados o los usados con intención expresiva: Creo que nació en mil novecientos cincuenta y tantos; Habría unas ciento cincuenta mil personas en la manifestación; ¡Te lo he repetido un millón de veces y no me haces caso!

f) Los números que forman parte de locuciones o frases hechas: No hay duda: es el número uno; Éramos cuatro gatos en la fiesta; Te da lo mismo ocho que ochenta; A mí me pasa tres cuartos de lo mismo.

Se escribirán con cifras:

a) Los números que exigirían el empleo de cuatro o más palabras en su escritura con letras: En verano la población asciende a 32 423 habitantes (más claro y de comprensión más rápida que treinta y dos mil cuatrocientos veintitrés). En algunos documentos, como cheques bancarios, contratos, letras de cambio, etc., por razones de seguridad, la expresión en cifras va acompañada normalmente de la expresión en palabras: Páguese al portador de este cheque la cantidad de veinticinco mil trescientos treinta y ocho euros.

b) Los números formados por una parte entera y una decimal: El índice de natalidad es de 1,5 (o 1.5, en los países que usan el punto como separador decimal) niños por mujer. También en este caso, en cheques bancarios, contratos, letras de cambio, etc., la expresión numérica suele acompañarse de la expresión lingüística: Páguese al portador de este cheque la cantidad de mil doscientos treinta y cuatro euros con veinticinco céntimos. El sustantivo cuantificado por una expresión numérica decimal, incluso si esta designa cantidad inferior a la unidad, debe ir en plural: 0,5 millones de pesos (y no 0,5 millón de pesos).

c) Los porcentajes superiores a diez: En las últimas elecciones votó el 84% de la población. No debe dejarse espacio de separación entre el número y el signo %. Hasta el diez suele alternar el empleo de cifras o palabras en la indicación de los porcentajes: El 3% (o tres por ciento) de los encuestados dijo no estar de acuerdo con la medida. El símbolo % debe leerse siempre «por ciento», no «por cien», salvo en el caso del 100%, que puede expresarse en letras de tres modos: cien por cien, cien por ciento o ciento por ciento (→ ciento, 3). No debe usarse el signo % cuando el porcentaje se expresa con palabras (el tres %). Tanto si se escribe con cifras como con palabras, la expresión de los porcentajes debe quedar dentro de la misma línea: 3 / %, tres / por ciento, tres por / ciento.

d) Los números referidos a unidades de medida, cuando van seguidos del símbolo correspondiente: Madrid dista 40 km de Guadalajara; Mañana se alcanzarán los 35 ºC. No se deben escribir en líneas diferentes la cifra y el símbolo: 40 / km, 35 / ºC.

e) Los números seguidos de la abreviatura del concepto que cuantifican: 5 cts. (‘cinco céntimos’), 45 págs. (‘cuarenta y cinco páginas’), 2 vols. (‘dos volúmenes’). No se deben escribir en líneas diferentes el número y la abreviatura: 5 / cts.

f) Los números pospuestos al sustantivo al que se refieren (expresado o no mediante abreviatura), usados para identificar un elemento concreto dentro de una serie: página 3 (o pág. 3), habitación 317 (o hab. 317), número 37 (o núm. 37), tabla 7, gráfico 15, etc.

Yupana o modelo arquitectónico de doble torreón, Lima.

Ortografía de los números escritos con cifras

Para escribir correctamente los números expresados en cifras, debe tenerse en cuenta lo siguiente:

a) Al escribir números de más de cuatro cifras, se agruparán estas de tres en tres, empezando por la derecha, y separando los grupos por espacios en blanco: 8 327 451 (y no por puntos o comas, como, dependiendo de las zonas, se hacía hasta ahora: 8.327.451; 8,327,451). Los números de cuatro cifras se escriben sin espacios de separación: 2458 (no 2 458). En ningún caso deben repartirse en líneas diferentes las cifras que componen un número: 8 327 / 451.

b) Nunca se escriben con puntos, comas ni blancos de separación los números referidos a años, páginas, versos, portales de vías urbanas, códigos postales, apartados de correos, números de artículos legales, decretos o leyes: año 2001, página 3142, código postal 28357.

c) Para separar la parte entera de la decimal debe usarse la coma, según establece la normativa internacional: El valor de π es 3,1416. No obstante, también se admite el uso anglosajón del punto, extendido en algunos países americanos: El valor de π es 3.1416. Se recomienda el uso del punto como separador decimal.

d) Las cantidades que tienen como base un sustantivo de significación numeral como millón, millardo, billón, trillón y cuatrillón, siempre que, al menos, las tres últimas cifras de su escritura en números sean ceros, podrán abreviarse mezclando el uso de cifras y letras en su escritura: 327 millones, 3,6 billones, 2 cuatrillones. Son sustantivos, entre otras cosas, porque si se expresa el elemento que cuantifican, este debe ir precedido de la preposición de: 327 millones de habitantes, 2 millardos de dólares. Este método abreviado no es válido para las cantidades en miles, ya que mil no es un sustantivo (la forma sustantiva es millar), sino que forma parte de adjetivos numerales compuestos de dos palabras, en cuya escritura no deben mezclarse cifras y letras; así, no debe escribirse 154 mil personas o 12 mil millones, por la misma razón que no escribimos 30 y siete ni cincuenta y 4. Debe escribirse 154 000 personas, 12 000 millones (o doce mil millones; → 1.1b).

e) En la expresión abreviada de los numerales ordinales (→ ordinales), se utilizan cifras seguidas de letras voladas. Como corresponde a las abreviaturas, se escribirá punto entre la cifra y la letra volada (→ abreviatura, 6d): 1.º (primero), 2.ª (segunda), 3.er (tercer).

Dudas frecuentes

Veintiuna personas, veintiuno por ciento

No es correcto decir veintiún personas o veintiún por ciento, ya que el numeral uno y los compuestos que lo contienen solo se apocopan ante sustantivos masculinos o ante sustantivos femeninos que comienzan por a tónica.

El numeral uno, una se apocopa en la forma un únicamente cuando antecede a sustantivos masculinos: un libro, un coche; o a sustantivos femeninos que comienzan por a tónica (una vocal es tónica cuando en ella recae el acento prosódico o de intensidad): un águila, un alma, un hacha; pero no se apocopa nunca cuando antecede a sustantivos femeninos que no comienzan por a tónica: una amapola, una mujer, una novela.

Consecuentemente, todos los numerales compuestos que contienen el numeral simple uno, una se comportan de la misma manera y solo se apocopan ante sustantivos masculinos y ante sustantivos femeninos que comienzan por a tónica. Por lo tanto, igual que decimos una mujer, una amapola, debemos decir veintiuna mujeres, treinta y una amapolas (y no veintiún mujeres, treinta y un amapolas).

Asimismo, debe decirse uno por ciento, veintiuno por ciento, treinta y uno por ciento (y no un por ciento, veintiún por ciento, treinta y un por ciento), ya que el numeral uno, una solo se apocopa ante determinado tipo de sustantivos, y por es una preposición.

Veintiuna mil personas o veintiún mil personas

Cuando entre el numeral y un sustantivo femenino se interpone la palabra mil, la concordancia de género entre el numeral y el sustantivo es opcional.

Los numerales compuestos que contienen el numeral simple uno, una concuerdan en género con el sustantivo al que determinan cuando lo preceden inmediatamente, por eso debe decirse veintiuna personas, treinta y una toneladas (y no veintiún personas, treinta y un toneladas). [Para los casos de apócope, véase Veintiuna personas, veintiuno por ciento en esta misma sección].

Pero cuando entre el numeral y un sustantivo femenino se interpone la palabra mil, la concordancia de género es opcional, por lo que puede decirse tanto veintiún mil personas, treinta y un mil toneladas, como veintiuna mil personas, treinta y una mil toneladas.

La concordancia en femenino (veintiuna mil personas, treinta y una mil toneladas) se está imponiendo en el uso actual por influjo de la que obligatoriamente establecen los numerales de la serie de las centenas, que acomodan siempre su género al del sustantivo, lo precedan inmediatamente o no (setecientas toneladas, setecientas mil toneladas).

Los miles de personas

Mil es un sustantivo masculino, por lo que los determinantes que lo acompañan deben ir también en masculino: los miles de personas, unos miles de personas.

Como sustantivo, la palabra mil es de género masculino y se usa, en singular, para designar el propio número: Después del novecientos noventa y nueve viene el mil. En plural significa ‘millares’ y va normalmente seguido de un complemento especificativo introducido por la preposición de: Había miles de personas en la puerta del estadio. Puesto que se trata de un sustantivo masculino, los determinantes que lo acompañen deben ir también en masculino: los miles de personas, unos miles de personas, esos miles de personas (y no las miles de personas, unas miles de personas, esas miles de personas).

Código

Código fuente R.

suppressPackageStartupMessages(library(data.table)) # Using the function fread

##' Writing integer numbers with Spanish words
##'
##' Write an integer number with Spanish words.
##' @title
##' @param x Integer number
##' @param uno How to deal with numbers ending with 1: `uno', `uno', `una'
##' @param masculino Words with masculine or feminine style
##' @return A string with Spanish transcription
##' @author Emilio Torres Manzanera
##' @examples
##' escribirnumeroenteroliteral(721)                  # "setecientos veintiún"
##' escribirnumeroenteroliteral(721, uno="uno")       # "setecientos veintiuno"
##' escribirnumeroenteroliteral(721, masculino=FALSE) # "setecientas veintiuna"
##' escribirnumeroenteroliteral(987654321,masculino=FALSE) # "novecientas ochenta y siete millones seiscientas cincuenta y cuatro mil trescientas veintiuna"
escribirnumeroenteroliteral <- function(x, uno="un", masculino = TRUE){
    if (abs(x) >= 10^18) { ## Trillions? No, thank you
        return(x)
    } else if (x != round(x)) { ## Decimal number? No, thank you
        return(x)
    } else if (x == 0) {
        return("cero")
    } else if (x < 0) { ## Is it a negative number?
        return(paste0("menos ", escribirnumeroenteroliteral(abs(x), uno, masculino)))
    }
    ## Not 1 nor 21 in this list.
    listanumeros <- "
| numero | literal      |
|      2 | dos          |
|      3 | tres         |
|      4 | cuatro       |
|      5 | cinco        |
|      6 | seis         |
|      7 | siete        |
|      8 | ocho         |
|      9 | nueve        |
|     10 | diez         |
|     11 | once         |
|     12 | doce         |
|     13 | trece        |
|     14 | catorce      |
|     15 | quince       |
|     16 | dieciséis    |
|     17 | diecisiete   |
|     18 | dieciocho    |
|     19 | diecinueve   |
|     20 | veinte       |
|     22 | veintidós    |
|     23 | veintitrés   |
|     24 | veinticuatro |
|     25 | veinticinco  |
|     26 | veintiséis   |
|     27 | veintisiete  |
|     28 | veintiocho   |
|     29 | veintinueve  |
|     30 | treinta      |
|     40 | cuarenta     |
|     50 | cincuenta    |
|     60 | sesenta      |
|     70 | setenta      |
|     80 | ochenta      |
|     90 | noventa      |
|    100 | cien         |
|    200 | doscien      |
|    300 | trescien     |
|    400 | cuatrocien   |
|    500 | quinien      |
|    600 | seiscien     |
|    700 | setecien     |
|    800 | ochocien     |
|    900 | novecien     |
|   1000 | mil          |
"
    tablanumeros <- data.table::fread(text = listanumeros, sep = "|")[, c(2, 3)]
    if (x == 1) { # A very special case: un, uno, una
        if (masculino) {
            if (uno == "un") {
                return("un")
            } else {
                return("uno")
            }
        } else {
            return("una")
        }
    } else if (x <= 100) { # Between 2 and 100
        literal <- tablanumeros[numero == x, literal]
        if (identical(literal, character(0))) {
            ## Not in the table
            if (x == 21) { ## Special case 21
                if (masculino) {
                    if (uno == "un") {
                        return("veintiún")
                    } else {
                        return("veintiuno")
                    }
                } else {
                    return("veintiuna")
                }
            } else { # Between 31 and 99
                filtro <- x / tablanumeros$numero > 1
                numerotablapordebajo <- max(tablanumeros$numero[filtro])
                literal <- tablanumeros[numero == numerotablapordebajo, literal]
                return(paste0(literal, " y ",
                              escribirnumeroenteroliteral(x - numerotablapordebajo, uno, masculino)))
            }
        } else { # It is in the table 2,..,29,30,40,50,...,90
            return(literal)
        }
    } else if (x < 1000) { # 101,...,999
        literal <- tablanumeros[numero == x, literal]
        if (identical(literal, character(0))) {
            ## No existe en la tabla
            filtro <- x / tablanumeros$numero > 1
            numerotablapordebajo <- max(tablanumeros$numero[filtro])
            literal <- tablanumeros[numero == numerotablapordebajo, literal]
            if (literal == "cien") {
                literal <- "ciento"
            } else {
                literal <- ifelse(masculino, paste0(literal, "tos"), paste0(literal, "tas"))
            }
            return(paste0(literal, " ",
                          escribirnumeroenteroliteral(x - numerotablapordebajo, uno, masculino)))
        } else { ## It is 100, 200, 300,..., 900
            if (literal != "cien") {
                literal <- ifelse(masculino, paste0(literal, "tos"), paste0(literal, "tas"))
            }
            return(literal)
        }
    } else if (x < 10^6) { # 1000, ..., 999 999
        numeropordebajo <- floor(x / 1000)
        literal <- if (numeropordebajo == 1) {
                       "mil"
                   } else {
                       paste0(escribirnumeroenteroliteral(numeropordebajo, uno, masculino), " mil")
                   }
        resto <- x - 1000 * numeropordebajo
        if (resto > 0) {
            literal <- paste0(literal, " ", escribirnumeroenteroliteral(resto, uno, masculino))
        }
        return(literal)
    } else if (x < 10^12) {
        numeropordebajo <- floor(x / 10^6)
        literal <- if (numeropordebajo == 1) {
                       "un millón"
                   } else {
                       paste0(escribirnumeroenteroliteral(numeropordebajo, uno, masculino),
                              " millones")
                   }
        resto <- x - 10^6 * numeropordebajo
        if (resto > 0) {
            literal <- paste0(literal, " ",
                              escribirnumeroenteroliteral(resto, uno, masculino))
        }
        return(literal)
    } else if (x < 10^18) {
        numeropordebajo <- floor(x / 10^12)
        literal <- if (numeropordebajo == 1) {
                       "un billón"
                   } else {
                       paste0(escribirnumeroenteroliteral(numeropordebajo, uno, masculino),
                              " billones")
                   }
        resto <- x - 10^12 * numeropordebajo
        if (resto > 0) {
            literal <- paste0(literal, " ",
                              escribirnumeroenteroliteral(resto, uno, masculino))
        }
        return(literal)
    }
    x
}