Siehe meine Antwort hier. stackoverflow.com/questions/69262/… Diese Frage war für .NET, aber ich habe sie mit einer PHP-Lösung beantwortet, daher sollte sie Ihnen helfen.
Nickf
Der einzige Weg, wie ich mir das vorstellen kann, ist eine if-Anweisung für jede mögliche Zahl, IE, if (1) dann "st" elseif (2) dann "nd" etc etc if (23000) then " nd ". Es ist ein Problem, wenn Sie große Zahlen haben, aber Sie könnten ein Programm schreiben, um den Code für Sie zu schreiben. Es könnte alle Zahlen durchlaufen, die das Wenn drucken, damit Sie es kopieren und in Ihren Code einfügen können.
Tom Gullen
2
@ Tom, eine Nachschlagetabelle ist möglicherweise besser. Initialisieren Sie sie einfach mit den 23000-Werten und erhalten Sie den Wert am Index n, wobei n die Zahl ist, für die Sie die Ordnungszahl wünschen.
John Boker
2
Col. Shrapnel. Sie können brillant, aber nicht alle. Auf jeden Fall danke für das Interesse an meiner Frage
ArK
@ John, sehr, sehr clevere Idee, es wäre sehr schnell zugänglich, und jeder Index repräsentiert die Nummer, nach der Sie suchen.
Obwohl es anfangs etwas schwer zu verstehen ist, denke ich jetzt, dass es am besten darstellt, wie das Ordnungssuffixsystem für Englisch funktioniert.
Erisco
5
Ich mag deine Lösung. Wenn Sie es vorziehen, keine 0. zu generieren, ändern Sie außerdem die letzte Zeile$abbreviation = ($number)? $number. $ends[$number % 10] : $number;
Gavin Jackson
1
@GavinJackson Ihre Ergänzung zu dieser hervorragenden Lösung hat mir wirklich geholfen (+1). Könnten Sie mir bitte erklären, was in der Berechnung vor sich geht? Ich will verstehen. Prost! EDIT: Gefunden eine Antwort: Bedingter Operator
Andrew Fox
Sorry, musste die 111 Stimmen zu 112 brechen: D machte es eine Funktion in Delphi zusammen mit einer Demo-App: pastebin.com/wvmz1CHY
Jerry Dodge
1
@ HafezDivandari - bist du sicher? Gerade mit 7.1.19 getestet und scheint gut zu funktionieren
Wissen Sie, ob es möglich ist, die Ordnungszahl in Wortform zu erhalten? dh erste, zweite, dritte usw. statt 1., 2., 3. ...
its_me
@jeremy Wenn ich versucht habe, NumberFormatter zu verwenden, wird immer ein Fehler ausgegeben, der NumberFomatter file not found. Wie haben Sie das umgangen?
Jhnferraris
1
@Jhn müssen Sie die Erweiterung installierenapt-get install php5-intl
Aley
@Aley ich verstehe. Yii hat einen eingebauten Formatierer, den wir gerade verwenden. heh
jhnferraris
20
Dies kann in einer einzigen Zeile erreicht werden, indem ähnliche Funktionen in den in PHP integrierten Datums- / Uhrzeitfunktionen genutzt werden. Ich reiche demütig ein:
Lösung:
function ordinalSuffix( $n ){return date('S',mktime(1,1,1,1,((($n>=10)+($n>=20)+($n==0))*10+ $n%10)));}
Ausführliche Erklärung:
Die integrierte date()Funktion verfügt über eine Suffix-Logik für die Berechnung des n-ten Tages des Monats. Das Suffix wird zurückgegeben, wenn Ses in der Formatzeichenfolge angegeben wird:
date('S',?);
Da date()ein Zeitstempel (für erfordert ?oben), werden wir unsere ganze Zahl übergeben $nals dayParameter mktime()und die Verwendung Blindwerte 1für die hour, minute, secondund month:
date('S', mktime(1,1,1,1, $n ));
Dies schlägt bei Werten außerhalb des Bereichs für einen Tag des Monats (dh $n > 31) ordnungsgemäß fehl, aber wir können eine einfache Inline-Logik hinzufügen, um $nbei 29 zu begrenzen :
Der einzig positive Wert( Mai 2017 ) Dies schlägt fehl $n == 0, aber das lässt sich leicht beheben, indem in diesem speziellen Fall 10 hinzugefügt werden:
Wie von @donatJ beobachtet, schlägt das Obige über 100 fehl (z. B. "111."), da die >=20Überprüfungen immer true zurückgeben. Um diese jedes Jahrhundert zurückzusetzen, fügen wir dem Vergleich einen Filter hinzu:
Ich mag diesen Ansatz, aber leider funktioniert er nicht :-( 30. kommt als 30. heraus. 40. kommt heraus als 40. usw.
Flukey
1
Ja entschuldigung. Als ich die Frage las, dachte ich, hey, das sollte durch eine einzige Codezeile möglich sein. Und ich habe es einfach weggeschrieben. Wie Sie aus meinen Änderungen sehen, verbessere ich mich. Nach der dritten Bearbeitung denke ich jetzt, dass es ziemlich fertig ist. Zumindest alle Zahlen von 1 bis 150 werden auf meinem Bildschirm gut gedruckt.
Paul
Sieht gut aus bis zu 500! (habe es nicht weiter getestet). Gute Arbeit! :-)
Sagt nichts über Daten in der Frage tho. Ich habe trotzdem upvoted - es ist eine schnelle und einfache Lösung, wenn Sie wissen, dass der Nummernkreis <32 sein wird
cronoklee
8
Ich habe das für PHP4 geschrieben. Es hat gut funktioniert und ist ziemlich sparsam.
Ich habe eine Funktion erstellt, die sich nicht auf die PHP- date();Funktion stützt, da sie nicht erforderlich ist, sondern sie auch so kompakt und kurz gemacht hat, wie ich derzeit für möglich halte.
Der Code : (121 Bytes insgesamt)
function ordinal($i){// PHP 5.2 and laterreturn($i.(($j=abs($i)%100)>10&&$j<14?'th':(($j%=10)>0&&$j<4?['st','nd','rd'][$j-1]:'th')));}
Kompakterer Code unten.
Es funktioniert wie folgt :
printf("The %s hour.\n", ordinal(0));// The 0th hour.
printf("The %s ossicle.\n", ordinal(1));// The 1st ossicle.
printf("The %s cat.\n", ordinal(12));// The 12th cat.
printf("The %s item.\n", ordinal(-23));// The -23rd item.
Wissenswertes zu dieser Funktion :
Es behandelt negative ganze Zahlen genauso wie positive ganze Zahlen und behält das Vorzeichen.
Es gibt erwartungsgemäß den 11., 12., 13., 811., 812., 813. usw. für die -zehn Zahlen zurück.
Dabei spielt es keine Dezimalzahlen überprüfen, sondern sie an ihrem Platz verläßt (Verwendung floor($i), round($i)oder ceil($i)am Anfang der letzten return - Anweisung).
Sie können auch format_number($i)am Anfang der endgültigen return-Anweisung hinzufügen , um eine durch Kommas getrennte Ganzzahl zu erhalten (wenn Sie Tausende, Millionen usw. anzeigen).
Sie können das einfach $ivom Anfang der return-Anweisung entfernen, wenn Sie nur das Ordnungssuffix ohne Ihre Eingabe zurückgeben möchten.
Diese Funktion funktioniert ab PHP 5.2, das im November 2006 veröffentlicht wurde, allein aufgrund der kurzen Array-Syntax. Wenn Sie zuvor eine Version haben, aktualisieren Sie diese bitte, da Sie fast ein Jahrzehnt veraltet sind! Andernfalls ersetzen Sie einfach die Inline ['st', 'nd', 'rd']durch eine temporäre Variable, die enthält array('st', 'nd', 'rd');.
Dieselbe Funktion (ohne Rückgabe der Eingabe), aber eine Explosionsansicht meiner Kurzfunktion zum besseren Verständnis:
function ordinal($i){
$j = abs($i);// make negatives into positives
$j = $j%100;// modulo 100; deal only with ones and tens; 0 through 99if($j>10&& $j<14)// if $j is over 10, but below 14 (so we deal with 11 to 13)return('th');// always return 'th' for 11th, 13th, 62912th, etc.
$j = $j%10;// modulo 10; deal only with ones; 0 through 9if($j==1)// 1st, 21st, 31st, 971streturn('st');if($j==2)// 2nd, 22nd, 32nd, 582ndreturn('nd');// if($j==3)// 3rd, 23rd, 33rd, 253rdreturn('rd');return('th');// everything else will suffixed with 'th' including 0th}
Code-Aktualisierung :
Hier ist eine modifizierte Version, die 14 ganze Bytes kürzer ist (insgesamt 107 Bytes):
function ordinal($i){return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');}
Oder so kurz wie möglich, 25 Bytes kürzer (insgesamt 96 Bytes):
function o($i){return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');}
Mit dieser letzten Funktion rufen o(121);Sie einfach auf und es wird genau das gleiche tun wie die anderen Funktionen, die ich aufgelistet habe.
Code Update # 2 :
Ben und ich haben zusammengearbeitet und es um 38 Bytes (insgesamt 83 Bytes) reduziert:
function o($i){return$i.@(($j=abs($i)%100)>10&&$j<14?th:[th,st,nd,rd][$j%10]?:th);}
Wir glauben nicht, dass es kürzer werden kann! Bereit, sich jedoch als falsch zu erweisen. :) :)
Hier ist eine weitere sehr kurze Version mit den Datumsfunktionen. Es funktioniert für jede Anzahl (nicht durch Tage des Monats beschränkt) und berücksichtigt, dass * 11th * 12th * 13th nicht dem * 1st * 2nd * 3rd-Format folgt.
Ich bin mir nicht ganz sicher, was diese Antwort zusätzlich zu ChintanThummars Antwort bietet. Nun, es deutet darauf hin, dass ChintanThummar eine Urheberrechtsverletzung begangen hat, es sei denn, er hat den Code an Ihrer Quelle geschrieben ...
Antworten:
aus Wikipedia :
Wo
$number
ist die Nummer, die Sie schreiben möchten? Funktioniert mit jeder natürlichen Zahl.Als eine Funktion:
quelle
$abbreviation = ($number)? $number. $ends[$number % 10] : $number;
PHP verfügt hierfür über integrierte Funktionen . Es kümmert sich sogar um die Internationalisierung!
Beachten Sie, dass diese Funktionalität nur in PHP 5.3.0 und höher verfügbar ist.
quelle
NumberFomatter file not found
. Wie haben Sie das umgangen?apt-get install php5-intl
Dies kann in einer einzigen Zeile erreicht werden, indem ähnliche Funktionen in den in PHP integrierten Datums- / Uhrzeitfunktionen genutzt werden. Ich reiche demütig ein:
Lösung:
Ausführliche Erklärung:
Die integrierte
date()
Funktion verfügt über eine Suffix-Logik für die Berechnung des n-ten Tages des Monats. Das Suffix wird zurückgegeben, wennS
es in der Formatzeichenfolge angegeben wird:Da
date()
ein Zeitstempel (für erfordert?
oben), werden wir unsere ganze Zahl übergeben$n
alsday
Parametermktime()
und die Verwendung Blindwerte1
für diehour
,minute
,second
undmonth
:Dies schlägt bei Werten außerhalb des Bereichs für einen Tag des Monats (dh
$n > 31
) ordnungsgemäß fehl, aber wir können eine einfache Inline-Logik hinzufügen, um$n
bei 29 zu begrenzen :Der einzig positive Wert( Mai 2017 ) Dies schlägt fehl$n == 0
, aber das lässt sich leicht beheben, indem in diesem speziellen Fall 10 hinzugefügt werden:Update, Mai 2017
Wie von @donatJ beobachtet, schlägt das Obige über 100 fehl (z. B. "111."), da die
>=20
Überprüfungen immer true zurückgeben. Um diese jedes Jahrhundert zurückzusetzen, fügen wir dem Vergleich einen Filter hinzu:Wickeln Sie es einfach in eine Funktion ein und los geht's!
quelle
Hier ist ein Einzeiler:
Wahrscheinlich die kürzeste Lösung. Kann natürlich von einer Funktion umschlossen werden:
Grüße, Paul
EDIT1: Korrektur des Codes für 11 bis 13.
EDIT2: Korrektur des Codes für 111, 211, ...
EDIT3: Jetzt funktioniert es auch für Vielfache von 10 richtig.
quelle
von http://www.phpro.org/examples/Ordinal-Suffix.html
quelle
Einfache und einfache Antwort lautet:
quelle
Ich habe das für PHP4 geschrieben. Es hat gut funktioniert und ist ziemlich sparsam.
quelle
Sie müssen nur die angegebene Funktion anwenden.
quelle
Generell können Sie das verwenden und echo get_placing_string (100) aufrufen.
quelle
Ich habe eine Funktion erstellt, die sich nicht auf die PHP-
date();
Funktion stützt, da sie nicht erforderlich ist, sondern sie auch so kompakt und kurz gemacht hat, wie ich derzeit für möglich halte.Der Code : (121 Bytes insgesamt)
Kompakterer Code unten.
Es funktioniert wie folgt :
Wissenswertes zu dieser Funktion :
floor($i)
,round($i)
oderceil($i)
am Anfang der letzten return - Anweisung).format_number($i)
am Anfang der endgültigen return-Anweisung hinzufügen , um eine durch Kommas getrennte Ganzzahl zu erhalten (wenn Sie Tausende, Millionen usw. anzeigen).$i
vom Anfang der return-Anweisung entfernen, wenn Sie nur das Ordnungssuffix ohne Ihre Eingabe zurückgeben möchten.Diese Funktion funktioniert ab PHP 5.2, das im November 2006 veröffentlicht wurde, allein aufgrund der kurzen Array-Syntax. Wenn Sie zuvor eine Version haben, aktualisieren Sie diese bitte, da Sie fast ein Jahrzehnt veraltet sind! Andernfalls ersetzen Sie einfach die Inline
['st', 'nd', 'rd']
durch eine temporäre Variable, die enthältarray('st', 'nd', 'rd');
.Dieselbe Funktion (ohne Rückgabe der Eingabe), aber eine Explosionsansicht meiner Kurzfunktion zum besseren Verständnis:
Code-Aktualisierung :
Hier ist eine modifizierte Version, die 14 ganze Bytes kürzer ist (insgesamt 107 Bytes):
Oder so kurz wie möglich, 25 Bytes kürzer (insgesamt 96 Bytes):
Mit dieser letzten Funktion rufen
o(121);
Sie einfach auf und es wird genau das gleiche tun wie die anderen Funktionen, die ich aufgelistet habe.Code Update # 2 :
Ben und ich haben zusammengearbeitet und es um 38 Bytes (insgesamt 83 Bytes) reduziert:
Wir glauben nicht, dass es kürzer werden kann! Bereit, sich jedoch als falsch zu erweisen. :) :)
Hoffe euch allen gefällt es.
quelle
abs()
mit Modul verwenden%
abs();
Entfernt das negative Vorzeichen, das ich brauchte.Eine noch kürzere Version für Daten im Monat (bis zu 31) anstelle von mktime () und ohne pecl intl:
oder prozedural:
Dies funktioniert natürlich, da der von mir ausgewählte Standardmonat (Januar) 31 Tage hat.
Interessanterweise wird es vor dem Ende neu gestartet, wenn Sie es mit Februar (oder einem anderen Monat ohne 31 Tage) versuchen:
Mit dem Datumsangaben
t
in Ihrer Schleife können Sie also bis zu den Tagen dieses Monats zählen : Anzahl der Tage im Monat.quelle
quelle
In PHP.net eine Antwort gefunden
quelle
Hier ist eine weitere sehr kurze Version mit den Datumsfunktionen. Es funktioniert für jede Anzahl (nicht durch Tage des Monats beschränkt) und berücksichtigt, dass * 11th * 12th * 13th nicht dem * 1st * 2nd * 3rd-Format folgt.
quelle
Ich mag diesen kleinen Ausschnitt
HIER
quelle