Me gustaría generar dinámicamente una cadena de texto basada en un día actual. Entonces, por ejemplo, si es el día 1, me gustaría que mi código genere = "Es el <dynamic> 1 * <dynamic string> st </ dynamic string> * </dynamic>".
Hay 12 días en total, así que he hecho lo siguiente:
He configurado un bucle for que recorre los 12 días.
En mi html, le he dado a mi elemento una identificación única con la que apuntarlo, vea a continuación:
<h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
Luego, dentro de mi bucle for, tengo el siguiente código:
$("#dynamicTitle span").html(i); var day = i; if (day == 1) { day = i + "st"; } else if (day == 2) { day = i + "nd" } else if (day == 3) { day = i + "rd" }
ACTUALIZAR
Este es el ciclo for completo según lo solicitado:
$(document).ready(function () {
for (i = 1; i <= 12; i++) {
var classy = "";
if (daysTilDate(i + 19) > 0) {
classy = "future";
$("#Day" + i).addClass(classy);
$("#mainHeading").html("");
$("#title").html("");
$("#description").html("");
} else if (daysTilDate(i + 19) < 0) {
classy = "past";
$("#Day" + i).addClass(classy);
$("#title").html("");
$("#description").html("");
$("#mainHeading").html("");
$(".cta").css('display', 'none');
$("#Day" + i + " .prizeLink").attr("href", "" + i + ".html");
} else {
classy = "current";
$("#Day" + i).addClass(classy);
$("#title").html(headings[i - 1]);
$("#description").html(descriptions[i - 1]);
$(".cta").css('display', 'block');
$("#dynamicImage").attr("src", ".." + i + ".jpg");
$("#mainHeading").html("");
$(".claimPrize").attr("href", "" + i + ".html");
$("#dynamicTitle span").html(i);
var day = i;
if (day == 1) {
day = i + "st";
} else if (day == 2) {
day = i + "nd"
} else if (day == 3) {
day = i + "rd"
} else if (day) {
}
}
}
javascript
jquery
numbers
Antonio Vasilev
fuente
fuente
if
bloque que el bucle contiene. Mostrar más códigos ....Respuestas:
Las reglas son las siguientes:
El siguiente código JavaScript (reescrito en junio '14) logra esto:
Salida de muestra para números entre 0-115:
fuente
111
,112
y113
debería resultar en"111th"
,"112th"
y"113th"
respectivamente, no el"111st"
,"112nd"
y"113rd"
producido por la función como codificado actualmente.n=>n+(n%10==1&&n%100!=11?'st':n%10==2&&n%100!=12?'nd':n%10==3&&n%100!=13?'rd':'th')
De Shopify
fuente
Enfoque mínimo de una línea para sufijos ordinales
(esto es para enteros positivos, ver más abajo para otras variaciones)
Explicación
Comience con una matriz con los sufijos
["st", "nd", "rd"]
. Queremos asignar enteros que terminen en 1, 2, 3 (pero que no terminen en 11, 12, 13) a los índices 0, 1, 2.Otros números enteros (incluidos los que terminan en 11, 12, 13) se pueden asignar a cualquier otra cosa; los índices que no se encuentran en la matriz se evaluarán
undefined
. Esto es falso en javascript y con el uso de lógico o (|| "th"
) la expresión regresará"th"
para estos enteros, que es exactamente lo que queremos.La expresión
((n + 90) % 100 - 10) % 10 - 1
hace el mapeo. Desglosándolo:(n + 90) % 100
: Esta expresión toma el entero de entrada - 10 mod 100, mapeo 10 a 0, ... 99 a 89, 0 a 90, ..., 9 a 99. Ahora los enteros que terminan en 11, 12, 13 están en la parte inferior final (asignado a 1, 2, 3).- 10
: Ahora 10 se asigna a −10, 19 a −1, 99 a 79, 0 a 80, ... 9 a 89. Los enteros que terminan en 11, 12, 13 se asignan a enteros negativos (−9, −8, −7).% 10
: Ahora todos los enteros que terminan en 1, 2 o 3 se asignan a 1, 2, 3. Todos los demás enteros se asignan a otra cosa (11, 12, 13 todavía se asignan a −9, −8, −7).- 1
: Restar uno da el mapeo final de 1, 2, 3 a 0, 1, 2.Verificando que funciona
Variaciones
Permitir enteros negativos:
En la sintaxis de flecha gorda ES6 (función anónima):
Actualizar
Una alternativa aún más corta para enteros positivos es la expresión
Ver esta publicación para una explicación.
Actualización 2
fuente
Puede usar las funciones de datos locales de las bibliotecas de momento .
Código:
fuente
Intl.PluralRules
, el método estándar .Solo me gustaría dejar la forma canónica de hacer esto aquí, ya que nadie parece saberlo.
Intl.PluralRules
constructor (Proyecto ECMA-402)fuente
¿Solo tienes 12 días? Estaría tentado a hacerlo solo una simple matriz de búsqueda:
luego
o
fuente
$("#dynamicTitle span").html(suffix[i-1]);
Al dividir el número en una matriz e invertirlo, podemos verificar fácilmente los últimos 2 dígitos del número usando
array[0]
yarray[1]
.Si un número está en la adolescencia
array[1] = 1
, requiere "th".fuente
fuente
n - 1
parte (devuelve indefinido). También falla para números mayores que 110, por ejemplo,getSuffix(111)
devuelve "st". Resuelve el problema del OP donde los números son del 1 al 12, pero no es una solución general. :-(Escribí esta función para resolver este problema:
Con esto, puede poner
.addSuffix()
cualquier número y obtendrá lo que desea. Por ejemplo:fuente
number
en esta cadenavar lastDigits=n.substring(number.length-2);
debería cambiarse athis
n
lugar dethis
, pero gracias por señalar ese error! :)Una versión alternativa de la función ordinal podría ser la siguiente:
Las variables se nombran más explícitamente, usan la convención de casos de camellos y pueden ser más rápidas.
fuente
Escribí esta simple función el otro día. Aunque para una fecha no necesita los números más grandes, esto también atenderá valores más altos (1013, 36021, etc.)
fuente
function ordsfx(a){return["th","st","nd","rd"][(a=~~(a<0?-a:a)%100)>10&&a<14||(a%=10)>3?0:a]}
Vea la versión anotada en https://gist.github.com/furf/986113#file-annotated-js
Corto, dulce y eficiente, como deberían ser las funciones de utilidad. Funciona con cualquier entero / flotante con signo / sin signo. (Aunque no puedo imaginar la necesidad de ordinalizar flotadores)
fuente
Aquí hay otra opción.
¿Notan la excepción para los adolescentes? ¡Los adolescentes son tan torpes!
Editar: Olvidé los días 11 y 12
fuente
Quería proporcionar una respuesta funcional a esta pregunta para complementar la respuesta existente:
hemos creado una matriz de valores especiales, lo importante es recordar que las matrices tienen un índice basado en cero, por lo que ordinalSuffix [0] es igual a 'st'.
Nuestra función numberToOrdinal verifica si el número termina en un número adolescente, en cuyo caso agregue el número con 'th' ya que todos los ordinales de números son 'th'. En el caso de que el número no sea un adolescente, pasamos el número a addSuffix que agrega el número al ordinal que se determina si el número menos 1 (porque estamos usando un índice basado en cero) mod 10 tiene un resto de 2 o menos se toma de la matriz, de lo contrario es 'th'.
salida de muestra:
fuente
El viejo que hice para mis cosas ...
fuente
Recomiendo encarecidamente la excelente biblioteca de fecha-fns . Rápido, modular, inmutable, funciona con fechas estándar.
Ver documentos de date-fns: https://date-fns.org/v2.0.0-alpha.9/docs/format
fuente
Escribí esta función para números más altos y todos los casos de prueba
fuente
Aquí hay un enfoque ligeramente diferente (no creo que las otras respuestas hagan esto). No estoy seguro de si lo amo o lo odio, ¡pero funciona!
fuente
Esto es para una línea y amantes de es6
Otra opción para + be number sería:
También para deshacerse del prefijo ordinal solo use estos:
siéntase libre de modificar para adaptarse a lo que necesita
fuente
También puedes usar la
scales::ordinal()
función. Es rápido y fácil de usar.fuente
Recomiendo encarecidamente esto, es muy fácil y sencillo de leer. Espero que te sirva de ayuda
SALIDA
fuente
Puedes usar
1<sup>st</sup> 2<sup>nd</sup> 3<sup>rd</sup> 4<sup>th</sup>
para posicionar el sufijo
fuente