まえがき
メリークリスマス!そしてハッピーバースデー私!自称やめ太郎先生の大ファンSeitenです!
今回は、使う機会があるようでないようでありそうなテクニック、"英語の序数をつける"コードを紹介します!
英語の序数のルール
- 下1桁が1の時はst、2の時はnd、3の時はrd、それ以外はthをつける。
- 十の位が1の時は1のルールを無視し、thをつける。
このルールに沿って、お手軽に英語の序数をつけた文字列を返す関数を実装してみます。
ordinal.cpp
std::string GetOrdinalNumber(unsigned long long num)
{
std::string res = std::to_string(num);
if (num / 10 % 10 == 1) res += "th"
else
{
switch (num % 10)
{
case 1:
res += "st";
break;
case 2:
res += "nd";
break;
case 3:
res += "rd";
break;
default:
res += "th";
break;
}
}
return res;
}
ordinal.js
function GetOrdinalNumber(num)
{
if (IsNaN(num) || !IsFinite(num) || num < 0) return "";
let res = num.toString(10);
if (num / 10 % 10 === 1) res += "th";
else
{
switch (num % 10)
{
case 1:
res += "st";
break;
case 2:
res += "nd";
break;
case 3:
res += "rd";
break;
default:
res += "th";
break;
}
}
return res;
}
ordinal.cs
public string GetOrdinalNumber(ulong num)
{
string res = num.ToString();
if (num / 10 % 10 == 1) res += "th";
else
{
switch (num % 10)
{
case 1:
res += "st";
break;
case 2:
res += "nd";
break;
case 3:
res += "rd";
break;
default:
res += "th";
break;
}
}
return res;
}
ordinal.vb
Public Function GetOrdinalNumber(ByVal num As ULong) As String
Dim res As String = num.ToString
If ((num \ 10) Mod 10) = 1 Then
res &= "th"
Else
Select Case num Mod 10
Case 1
res &= "st"
Case 2
res &= "nd"
Case 3
res &= "rd"
Case Else
res &= "th"
End Select
End If
Return res
End Function
ordinal.java
public String GetOrdinalNumber(long num)
{
if (num < 0) return ""
String res = Long.toString(num);
if (num / 10 % 10 == 1) res += "th";
else
{
switch (num % 10)
{
case 1:
res += "st";
break;
case 2:
res += "nd";
break;
case 3:
res += "rd";
break;
default:
res += "th";
break;
}
}
return res;
}
……で、何に使うの?
わかりません!
ただし、筆者は音楽ゲームでステージ表示するのに使いました。
ライセンス
Apache License 2.0にします。
作者名は「Seiten Minagawa」でお願いします。