「+5」を整数に直したら、10言語すべてが黙って 5 にした ― その書き方、本当に通る?⑤

C#
B!

受け取った文字列が整数なら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」以外も、関数ごとに受け付ける形が違った

決まりでは全部「整数ではありません」になる入力です。エラーにならずに数として返した言語を並べます。

入力受け付けた言語返した数
+510言語すべて5
12(前に空白)Python・Ruby・C#・PHP・JavaScript(10言語中5言語)12
12(全角の数字)Python・Java・Kotlin(10言語中3言語)12
12.0PHP・JavaScript(10言語中2言語)12
1_000Python・Ruby(10言語中2言語)1000
0x1AJavaScript・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回 にあります。毎朝、実際に動かして確かめています
連載「その書き方、本当に通る?」(全8回)
  1. 第1回:「2026-02-30」を渡したら、PHP と JavaScript だけが黙って3月2日にした
  2. 第2回:JavaScript で「月の最終日」を出したら、日本では毎回1日前になった
  3. 第3回:C# の Normalize(FormKC) が、Docker の中では何もしなかった
  4. 第4回:辞書の「取り出す順番」を10言語で20回ずつ試したら、5通りの性格に分かれた
  5. 第5回:「+5」を整数に直したら、10言語すべてが黙って 5 にした(この記事)
  6. 第6回:メールアドレスの正規表現の「$」が、最後の改行を通した
  7. 第7回:「東京,大阪,」を split したら、Java・Ruby・Swift は最後の空の項目を捨てた
  8. 第8回:Excel の「CSV UTF-8」を読ませたら、10言語すべてが見出しの行を見失った
B!
← 一覧へ戻る