Gostaria de gerar dinamicamente uma sequência de texto com base nos dias atuais. Por exemplo, se for o dia 1, gostaria que meu código gere = "É a <dinâmica> 1 * <cadeia dinâmica> st </ cadeia dinâmica> * </dynamic>".
Há 12 dias no total, então eu fiz o seguinte:
Eu configurei um loop for que percorre os 12 dias.
No meu html, dei ao meu elemento um ID exclusivo com o qual segmentá-lo, veja abaixo:
<h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
Então, dentro do meu loop for, tenho o seguinte 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" }
ATUALIZAR
Este é o loop for inteiro, conforme 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
fonte
fonte
if
bloco que é ainda contido pelo loop? Mostrar mais código ....Respostas:
As regras são as seguintes:
O seguinte código JavaScript (reescrito em jun '14) realiza isso:
Exemplo de saída para números entre 0 e 115:
fonte
111
,112
e113
deve resultar em"111th"
,"112th"
e,"113th"
respectivamente, não o"111st"
,"112nd"
, e"113rd"
produzido pela função, tal como actualmente codificada.n=>n+(n%10==1&&n%100!=11?'st':n%10==2&&n%100!=12?'nd':n%10==3&&n%100!=13?'rd':'th')
No Shopify
fonte
Abordagem mínima de uma linha para sufixos ordinais
(isto é para números inteiros positivos, veja abaixo outras variações)
Explicação
Comece com uma matriz com os sufixos
["st", "nd", "rd"]
. Queremos mapear números inteiros terminando em 1, 2, 3 (mas não terminando em 11, 12, 13) para os índices 0, 1, 2.Outros números inteiros (incluindo aqueles que terminam em 11, 12, 13) podem ser mapeados para qualquer outra coisa - os índices não encontrados na matriz serão avaliados como
undefined
. Isso é falso em javascript e com o uso de logic ou (|| "th"
) a expressão retornará"th"
para esses números inteiros, exatamente o que queremos.A expressão
((n + 90) % 100 - 10) % 10 - 1
faz o mapeamento. Dividindo:(n + 90) % 100
: Esta expressão leva o número inteiro de entrada - 10 mod 100, mapeando 10 a 0, ... 99 a 89, 0 a 90, ..., 9 a 99. Agora, os números inteiros que terminam em 11, 12, 13 estão no mais baixo end (mapeado para 1, 2, 3).- 10
: Agora 10 é mapeado para −10, 19 para -1, 99 para 79, 0 para 80, ... 9 a 89. Os números inteiros que terminam em 11, 12, 13 são mapeados para números inteiros negativos (−9, −8, -7).% 10
: Agora todos os números inteiros que terminam em 1, 2 ou 3 são mapeados para 1, 2, 3. Todos os outros números inteiros são mapeados para outra coisa (11, 12, 13 ainda são mapeados para -9, -8, -7).- 1
: Subtrair um fornece o mapeamento final de 1, 2, 3 a 0, 1, 2.Verificando se funciona
Variações
Permitindo números inteiros negativos:
Na sintaxe da seta gorda ES6 (função anônima):
Atualizar
Uma alternativa ainda mais curta para números inteiros positivos é a expressão
Veja este post para explicação.
Atualização 2
fonte
Você pode usar as funções de dados locais das bibliotecas de momento .
Código:
fonte
Intl.PluralRules
, o método padrão .Gostaria apenas de deixar aqui a maneira canônica de fazer isso aqui, pois ninguém parece saber disso.
Intl.PluralRules
construtor (Rascunho ECMA-402)fonte
Você só tem 12 dias? Eu ficaria tentado a torná-lo apenas uma matriz de pesquisa simples:
então
ou
fonte
$("#dynamicTitle span").html(suffix[i-1]);
Dividindo o número em uma matriz e revertendo, podemos verificar facilmente os últimos 2 dígitos do número usando
array[0]
earray[1]
.Se um número está na adolescência,
array[1] = 1
é necessário "th".fonte
fonte
n - 1
peça (retorna indefinido). Também falha para números maiores que 110, por exemplo,getSuffix(111)
retorna "st". Ele resolve o problema do OP, onde os números são de 1 a 12, mas não é uma solução geral. :-(Eu escrevi esta função para resolver este problema:
Com isso, você pode colocar
.addSuffix()
qualquer número e isso resultará no que você deseja. Por exemplo:fonte
number
neste cordavar lastDigits=n.substring(number.length-2);
deve ser alterado parathis
n
vez dethis
, mas obrigado por apontar esse bug! :)Uma versão alternativa da função ordinal pode ser a seguinte:
As variáveis são nomeadas de maneira mais explícita, usam a convenção de camelo e podem ser mais rápidas.
fonte
Eu escrevi essa função simples outro dia. Embora para uma data você não precise de números maiores, isso também atenderá a valores mais altos (1013, 36021, etc ...)
fonte
function ordsfx(a){return["th","st","nd","rd"][(a=~~(a<0?-a:a)%100)>10&&a<14||(a%=10)>3?0:a]}
Veja a versão anotada em https://gist.github.com/furf/986113#file-annotated-js
Curto, doce e eficiente, assim como as funções de utilidade. Funciona com qualquer número inteiro / float assinado / não assinado. (Mesmo que eu não possa imaginar a necessidade de ordinalizar carros alegóricos)
fonte
Aqui está outra opção.
Notou a exceção para os adolescentes? Os adolescentes são tão desajeitados!
Edit: Esqueceu 11 e 12
fonte
Eu queria fornecer uma resposta funcional para esta pergunta para complementar a resposta existente:
Como criamos uma matriz de valores especiais, o importante é lembrar que as matrizes têm um índice baseado em zero, então ordinalSuffix [0] é igual a 'st'.
Nossa função numberToOrdinal verifica se o número termina em um número adolescente; nesse caso, acrescente o número com 'th', pois todos os números ordinais são 'th'. No caso de o número não ser adolescente, passamos o número para addSuffix, que adiciona o número ao ordinal, que é determinado por se o número menos 1 (porque estamos usando um índice baseado em zero), o mod 10 tem um restante de 2 ou menos é retirado da matriz, caso contrário, é 'th'.
saída de amostra:
fonte
Antigo que fiz para minhas coisas ...
fonte
Recomendamos vivamente a excelente biblioteca date-fns . Rápido, modular, imutável, funciona com datas padrão.
Consulte a documentação do date-fns: https://date-fns.org/v2.0.0-alpha.9/docs/format
fonte
Eu escrevi essa função para números mais altos e todos os casos de teste
fonte
Aqui está uma abordagem um pouco diferente (não acho que as outras respostas façam isso). Não tenho certeza se eu amo ou odeio, mas funciona!
fonte
Isto é para forros e amantes de es6
Outra opção para + be number seria:
Também para se livrar do prefixo ordinal, use estes:
sinta-se livre para modificar para se adequar às suas necessidades
fonte
Você também pode usar a
scales::ordinal()
função É rápido e simples de usar.fonte
Eu recomendo isso fortemente, é super fácil e direto de ler. Espero que ajude?
RESULTADO
fonte
Você pode usar
1<sup>st</sup> 2<sup>nd</sup> 3<sup>rd</sup> 4<sup>th</sup>
para posicionar o sufixo
fonte