Tengo el número y necesito agregar el sufijo: 'st', 'nd', 'rd', 'th'. Entonces, por ejemplo: si el número es 42, el sufijo es 'nd', 521 es 'st' y 113 es 'th', y así sucesivamente. Necesito hacer esto en Perl. Cualquier puntero.Cómo recupero el sufijo ordinal de un entero en Perl (como st, nd, rd, th)
Respuesta
Prueba esto:
my $ordinal;
if ($foo =~ /(?<!1)1$/) {
$ordinal = 'st';
} elsif ($foo =~ /(?<!1)2$/) {
$ordinal = 'nd';
} elsif ($foo =~ /(?<!1)3$/) {
$ordinal = 'rd';
} else {
$ordinal = 'th';
}
Uso Lingua::EN::Numbers::Ordinate. A partir de la sinopsis:
use Lingua::EN::Numbers::Ordinate;
print ordinate(4), "\n";
# prints 4th
print ordinate(-342), "\n";
# prints -342nd
# Example of actual use:
...
for(my $i = 0; $i < @records; $i++) {
unless(is_valid($record[$i]) {
warn "The ", ordinate($i), " record is invalid!\n";
next;
}
...
}
probar este breve subrutina
use strict;
use warnings;
sub ordinal {
return $_.(qw/th st nd rd/)[/(?<!1)([123])$/ ? $1 : 0] for int shift;
}
for (42, 521, 113) {
print ordinal($_), "\n";
}
salida
42nd
521st
113th
Hay algo que no entiendo completamente aquí. ¿Por qué un bucle 'for' cuando solo hay un elemento como argumento? También podría funcionar 'return int (shift). (qw/... '. Para varios parámetros, el bucle' for' no funcionaría ni a causa de la declaración 'return'. Funciona bien tal como está, pero ¿extrañé algo sobre el bucle? – Birei
@Birei: es solo una forma de poner '$ _ [0]' en '$ _'. Tu camino no funcionaría ya que la expresión regular necesita el valor para estar en' $ _'. Es muy similar a la nueva palabra de lenguaje 'given' pero tú no se puede utilizar como un modificador de declaración como se puede con 'for'. – Borodin
Ah, vale. Gracias. No entendí el punto de' $ _'. Merece un ** + 1 **. – Birei
he aquí una solución which I originally wrote for a code golf challenge, ligeramente reescrito para ajustarse a las mejores prácticas habituales de código no-golf :
$number =~ s/(1?\d)$/$1 . ((qw'th st nd rd')[$1] || 'th')/e;
La forma en que funciona es que la expresión regular (1?\d)$
coincide con el último dígito del número, más el dígito anterior si es 1
. La sustitución utiliza los dígitos coincidentes como índice de la lista (qw'th st nd rd')
, asignando 0 a th
, 1 a st
, 2 a nd
, 3 a rd
y cualquier otro valor a undef. Finalmente, el operador ||
reemplaza undef por th
.
Si no te gusta s///e
, básicamente se puede escribir la misma solución, p. de esta manera:
for ($number) {
/(1?\d)$/ or next;
$_ .= (qw'th st nd rd')[$1] || 'th';
}
o como una función:
sub ordinal ($) {
$_[0] =~ /(1?\d)$/ or return;
return $_[0] . ((qw'th st nd rd')[$1] || 'th');
}
Otra solución (aunque me gusta las respuestas preexistentes que son independientes de la utilización de módulos mejores):
use Date::Calc 'English_Ordinal';
print English_Ordinal $ARGV[0];
- 1. formato de python datetime con "st", "nd", "rd", "th" (sufijo ordinal en inglés) como "S" de PHP
- 2. Formateo de la fecha en Unix para incluir el sufijo en el día (st, nd, rd y th)
- 3. Fechas de análisis del formato "10 de enero de 2010" en Java? (con indicadores ordinales, st | nd | rd | th)
- 4. ¿Hay alguna manera fácil en .NET de obtener las terminaciones "st", "nd", "rd" y "th" para los números?
- 5. ¿Cómo obtener el sufijo ordinal de un número para muchos idiomas en Java o Groovy
- 6. En Ruby on Rails, ¿cómo puedo formatear una fecha con el sufijo "th", como en "Sun Oct 5th"?
- 7. ¿Cómo recupero el ancho del terminal en Perl?
- 8. ¿Cómo puedo producir un formato de fecha como "1 de noviembre" en C#
- 9. Perl ¿Cómo recupero una matriz de un hash de matrices?
- 10. Cómo transformar un número (1,2,3, etc.) en un número ordinal (1º, 2º, 3º, etc.) usando xslt
- 11. Ordenar lista de cadenas de sufijo entero en Python
- 12. Cómo formatear una fecha en ruby para incluir "rd" como en "3rd"
- 13. ¿Cómo funciona la mónada ST?
- 14. ¿Es posible envolver un entero y llamarlo como un entero?
- 15. cómo pasar un entero como ConverterParameter?
- 16. ¿Por qué DecimalFormat permite caracteres como sufijo?
- 17. Conversión de Android a formato ordinal
- 18. manera segura (st) cambiar el nombre de un proyecto delphi
- 19. ¿Cómo recupero el tamaño de un directorio de Perforce?
- 20. ¿Cómo recupero un repositorio git de Heroku?
- 21. ¿Es posible crear un TH con TableRow.insertCell()?
- 22. Cómo pasar el parámetro n a printf ("% nd", some_int);
- 23. Formateo de un entero como octal
- 24. ¿Cómo obtener un entero de MySQL como número entero en PHP?
- 25. ¿Qué significa el sufijo `X` en los espacios de nombres?
- 26. ¿Cómo recupero datos externos de MS SQL de un blog de Wordpress?
- 27. ¿Cómo recupero un valor de componente JSF utilizando EL?
- 28. ¿Por qué la gente usa _? como un sufijo identificador?
- 29. ¿Qué es ST en PostGIS?
- 30. Usar un escalar como condición en perl
Upvote para el uso productivo de la escurridiza aserción de mirada negativa de ancho cero. Aunque (tristemente) como señala Bill Ruppert, ya hay un módulo de CPAN para esto. –
Aunque hay * una * solución de CPAN, me gusta esta también. Está bien pensado, es muy legible, está desprovisto de dependencias y es tan preciso como la solución CPAN para cualquier número entero. – DavidO