受け取った文字列が整数なら2倍にして出し、整数でなければ「整数ではありません」と出す。入力チェックのいちばん基本の形です。各言語の「文字列を整数に直す」いちばん普通の関数で書き、+5 を渡しました。
10言語中10言語が、エラーを出さずに 5 の2倍は 10 と答えました。
何をしたか
CODE Polyglot の入門 第11回 は、受け付ける形を先に決めてあります。「半角の数字だけ(先頭にマイナスが1つ付いてもよい)」です。前の空白・全角の数字・小数点・プラス記号・下線(_)・0x は、すべて「整数ではありません」が正解です。
初心者がよく書く形は、変換して、失敗したら「整数ではありません」と出すものです。Python ならこうです。
try:
n = int(s)
except ValueError:
print("整数ではありません")
sys.exit()
Go は strconv.Atoi、Java は Long.parseLong、Kotlin は toLongOrNull()、C# は long.TryParse、Rust は parse::<i64>()、Swift は Int(s)、Ruby は Integer(s)、PHP は is_numeric と (int)、JavaScript は Number(s) を使いました。毎朝の検証と同じ Linux の環境で動かしています。
「+5」以外も、関数ごとに受け付ける形が違った
決まりでは全部「整数ではありません」になる入力です。エラーにならずに数として返した言語を並べます。
| 入力 | 受け付けた言語 | 返した数 |
|---|---|---|
+5 | 10言語すべて | 5 |
12(前に空白) | Python・Ruby・C#・PHP・JavaScript(10言語中5言語) | 12 |
12(全角の数字) | Python・Java・Kotlin(10言語中3言語) | 12 |
12.0 | PHP・JavaScript(10言語中2言語) | 12 |
1_000 | Python・Ruby(10言語中2言語) | 1000 |
0x1A | JavaScript・Ruby(10言語中2言語) | 26 |
| 空の文字列 | JavaScript(10言語中1言語) | 0 |
+5 以外の6件をすべて断ったのは、Go・Rust・Swift の3言語だけでした。いちばん多く通してしまったのは JavaScript の Number() で、この7件中5件を数として受け付けました(断ったのは全角の数字と 1_000)。空の文字列が 0 になるのは、フォームの空欄が「0 と入力された」ことになるので、とくに気づきにくい間違いです。
「直せたら整数」という書き方は、「関数が受け付ける形」をそのまま「自分のプログラムが受け付ける形」にしてしまいます。そして関数が受け付ける形は、言語ごとに違います。
どう直したか
受け付ける形を先に決めて、その形かを確かめてから数に直します。この回では「- が0個か1個、続いて半角の数字が1つ以上」を正規表現で確かめました。Python ならこうです。
# int() は前後の空白・全角の数字・「+」・「_」も受け付けるので、先に「-? と半角数字だけ」かを確かめる
if not re.fullmatch(r"-?[0-9]+", s):
print("整数ではありません")
sys.exit()
n = int(s)
JavaScript も同じ考え方です。
// Number() は空の文字列を 0 に、" 12" や "0x1A" も数にするので、先に「-? と半角数字だけ」かを確かめる
if (!/^-?[0-9]+$/.test(s)) {
console.log("整数ではありません");
process.exit();
}
\d ではなく [0-9] と書くのは、言語によって \d が全角の数字にも合うからです(入門 第7回)。直した版は、10言語とも15件中15件が正解になりました。
まとめ
- 「数に直せたら整数」は、どの言語でも成り立たなかった。
+5は10言語すべてが受け付けた - 空白・全角・
_・0x・空欄をどう扱うかは、関数によって違う。関数に任せず、受け付ける形を先に決めて確かめる - 「+5 を受け付ける」と決めるのも1つの答え。大事なのは、決めてから書くこと
- 10言語の全プログラムと、つまずきの表は 入門 第11回 にあります。毎朝、実際に動かして確かめています
- 第1回:「2026-02-30」を渡したら、PHP と JavaScript だけが黙って3月2日にした
- 第2回:JavaScript で「月の最終日」を出したら、日本では毎回1日前になった
- 第3回:C# の Normalize(FormKC) が、Docker の中では何もしなかった
- 第4回:辞書の「取り出す順番」を10言語で20回ずつ試したら、5通りの性格に分かれた
- 第5回:「+5」を整数に直したら、10言語すべてが黙って 5 にした(この記事)
- 第6回:メールアドレスの正規表現の「$」が、最後の改行を通した
- 第7回:「東京,大阪,」を split したら、Java・Ruby・Swift は最後の空の項目を捨てた
- 第8回:Excel の「CSV UTF-8」を読ませたら、10言語すべてが見出しの行を見失った
Analyzegear


