【Python】文字列を数値に変換する方法をわかりやすく解説
はじめに
Pythonでプログラミングを始めるとき、初めに理解しておくと便利なのが「文字列」と「数値」を自在に扱う方法です。
文字列とは、アルファベットや数字、記号などが組み合わさった要素を表し、Pythonではシングルクォートやダブルクォートで囲んだものが該当します。
一方で、数値は計算や比較に用いられるデータ型です。 たとえば在庫数や合計金額など、実務でも幅広く登場するはずです。
もし文字列を数値として使えなければ、計算ができず不便でしょう。 そこで本記事では、Pythonにおける文字列から数値への変換方法をやさしく解説します。
ここでは基本的な関数の使い方だけでなく、実務に寄り添った活用シーンや応用例も合わせて紹介します。 はじめてPythonに触れる方でも、読み進めることで迷いが少なくなるはずです。
この記事を読むとわかること
- 文字列を数値に変換する基本的な方法
- 実務で役立つ文字列と数値の使い分け
- int()・float()などの具体的なコード例
- 変換に失敗するケースへの対処方法
- 複雑なデータを扱うためのヒント
この記事を読むことで、文字列と数値の相互変換に関する初歩を理解できるだけでなく、実務的な観点でも「どのようにコードを書けばトラブルを回避できるか」がイメージできるようになるでしょう。
文字列と数値を変換する必要性
プログラミング実務では、データの多くがテキスト形式でやり取りされます。
たとえば、外部システムから受け取ったデータが「'100'」という文字列だったとしても、計算をするには数値に変換して「100」という数値として認識させなければなりません。
こうした場面は以下のようなケースで頻繁に登場します。
- 会計システムで売上を集計するときに、文字列型で受け取った金額を合計する
- 在庫情報をCSVファイルで受け取り、そのデータを計算処理へ回す
- ユーザーが入力フォームに書いた内容を数値かどうか判定し、計算結果を表示する
文字列のままでは計算や比較が不可能です。 そのため、数値として認識させる変換が大切です。
文字列から数値への基本的な変換方法
Pythonでは、文字列を数値に変換するためにいくつかの組み込み関数を用意しています。
最も代表的なものは int()
と float()
でしょう。
たとえば「"123"」という文字列を整数に変換したい場合は int("123")
を使います。
text_num = "123" num = int(text_num) print(num + 10) # 133
この例では、「"123"」という文字列を整数 123
として扱うことで、さらに「+10」などの四則演算が可能になります。
また小数を含む場合は float()
を使うことで、例えば「"12.34"」から小数型を取得できます。
text_float = "12.34" num_float = float(text_float) print(num_float * 2) # 24.68
文字列を数値に変換できるようになると、読み込んだデータを計算したり条件分岐に活用したりと、処理の幅が大きく広がります。
実務でよくあるシチュエーションと活用イメージ
プログラミング初心者の方は「文字列と数値の変換なんてどんなときに使うんだろう?」と疑問を持つかもしれません。
実務では、データのやり取りが文字列形式になることが多いため、変換はほぼ必須といっても過言ではありません。 具体的な場面を想像すると、以下のようなシチュエーションが考えられます。
- フォーム入力で受け取ったデータを数値に直し、予算や売上を計算
- あるサービスから送信されるJSONデータ(文字列)を解析し、合計や平均を出す
- 複数の値を取り込んでまとめて処理する際、データ型が混在しているために整理が必要
たとえば売上集計の場面では「'1000'」「'500'」など文字列が並んでいると、数字の合計がすぐには求められません。
int()
などを使って数値に変換してから処理すれば、合算もスムーズです。
また在庫管理システムでも、外部ファイルでやり取りされるデータが文字列のケースは珍しくありません。 CSVやExcelから読み込んだデータを一旦文字列として扱い、必要な項目だけ数値化するといった流れはよくあります。
int() で整数へ変換する基本
Pythonで文字列を整数に変換したいときは int()
を使います。
str_value = "456" int_value = int(str_value) print(int_value + 44) # 500
この例では、文字列「"456"」を int()
に渡すことで整数に変換できました。
ただし、整数に変換するためには元の文字列が整数として妥当な値である必要があります。
小数点やアルファベットが含まれていると ValueError
が発生し、コードがエラーを起こす点には注意が必要です。
float() で小数にも対応
売上や金額、あるいは重量などを扱うときには小数が登場します。
この場合は float()
を使います。
str_value = "123.45" float_value = float(str_value) print(float_value + 0.55) # 124.0
このように「"123.45"」のような文字列を小数に変換しておけば、足し算や引き算などの処理ができるようになります。 ただし、浮動小数点は厳密な精度を保証しないため、金額など少しの誤差が重大なトラブルにつながる可能性がある場合は、のちほど紹介する Decimal 型の活用を検討すると安心です。
変換エラーを回避する方法
文字列の中には数字以外が含まれているケースもあるでしょう。
たとえば金額の文字列にカンマ区切りが入っていたり、単位が含まれていたりするときはそのまま int()
や float()
を使うとエラーになります。
str_value = "12,000" # 12,000円という表記 converted = int(str_value) # ValueErrorが発生する
こういったケースを回避するには、以下のように文字列を事前に整形する方法が一般的です。
str_value = "12,000" cleaned_value = str_value.replace(",", "") # カンマを除去 int_value = int(cleaned_value) print(int_value) # 12000
もし数値とは無関係な文字が混ざっている場合は、処理前にそれらを除去したり、あるいは入力値が数値として妥当かどうかを検証する流れを組むことが多いです。
try-except でエラーを処理する
実務では、ユーザーが入力したデータに数字以外の要素が混ざることが珍しくありません。 アプリケーションが不意に落ちるのを防ぐためには、try-except 構文でエラーを補足し、適切に対処するのがよいでしょう。
user_input = "abc" try: num = int(user_input) print(num) except ValueError: print("入力が数値ではありません")
ここでは文字列「"abc"」を整数へ変換しようとしていますが、変換できない場合は ValueError
が発生します。
この ValueError
を except で拾い、特定の処理を行うことでアプリケーションの異常終了を防ぐわけです。
大規模なデータを扱う現場でも、データクレンジング(不要なデータの排除や整形)は非常に重要です。 try-except の使い方を覚えておくと、プログラムが突然停止するリスクを減らせます。
進数の文字列を変換する
Pythonの int()
は、第二引数で進数を指定することができます。
10進数だけでなく16進数や2進数など、異なる進数表現の文字列を変換したい場面は少なくありません。
hex_str = "1A" # 16進数 int_value = int(hex_str, 16) print(int_value) # 26
たとえばシステム開発で、ログに16進数が記録されるケースがあります。
そうしたログを解析してデータを可視化する際は、このように int("1A", 16)
のような呼び出しで10進数へ変換します。
同様に2進数の文字列 "1010" などを変換したいときは、int("1010", 2)
と書くと10進数での値を取得できます。
Decimal を使うメリット
先ほど挙げたように、float
は内部処理が二進数ベースで行われるため、非常に大きな数や小数点以下の計算でわずかなズレが生じることがあります。
こうした誤差を防ぎたいシーン、たとえば通貨計算などにおいては decimal
モジュールの Decimal クラスが重宝されます。
以下は簡単な例です。
from decimal import Decimal str_value = "0.1" float_value = float(str_value) decimal_value = Decimal(str_value) print(float_value * 3) # 0.30000000000000004 print(decimal_value * 3) # 0.3
float_value
の場合、0.1を3回足すと極わずかなズレが出ることがありますが、Decimal
は10進数の計算を重視して設計されているため、見た目通りに計算が行われるのが特徴です。
大規模な金額計算や金融系システムなど、正確な小数計算が求められる場面では Decimal
を使うことでトラブル回避に繋がります。
文字列と数値の相互変換を使った実務的なサンプル
ここからは、変換の基本を押さえたうえで実務に活かしやすいサンプルコードを見ていきましょう。 以下はCSV形式のデータを読み込み、それぞれの行に含まれる金額(文字列)を合計する簡単な例です。
import csv data = """item,price Apple,120 Banana,80 Orange,200 """ lines = data.splitlines() reader = csv.DictReader(lines) total_price = 0 for row in reader: price_str = row["price"] # "120" のような文字列 price_int = int(price_str) total_price += price_int print("合計金額:", total_price) # 400
上記の例では、CSVデータの各行から price
を取り出し、int()
で数値化しています。
こうすることで、文字列が混在していても価格の合計をスムーズに求められます。
実際の業務では、ここにデータ検証のステップを挟んだり、別の列の集計処理を追加したりするケースが出てくるでしょう。
数値から文字列への変換も覚えよう
実務においては、数値から文字列に戻すこともよくあります。 たとえば在庫数を画面上に表示するときには、そのまま数値のままではなく文字列として扱う必要があるからです。
Pythonでは、数値から文字列への変換に str()
を使います。
num_value = 789 str_converted = str(num_value) print(str_converted) # "789" print(str_converted + "円") # "789円"
たとえ数値で計算を行っていても、最終的には文字列で表示したいという場面は非常に多いものです。 画面表示やファイルへの書き込みなどの場面では、必ずこの相互変換を意識しておきましょう。
数値の書式設定とゼロ埋め
文字列へ変換する際に、数値を0埋めしたり桁区切りを入れたいケースもあります。
たとえば、注文番号を 0001
のように表現したい場合や、画面に「1,234」と3桁区切りで表示したい場合がそれに当たります。
Pythonには書式設定を行うための便利な方法があります。
order_number = 5 formatted = f"{order_number:04d}" # 4桁ゼロ埋め print(formatted) # "0005" price = 1234 formatted_price = f"{price:,}" # 3桁区切り print(formatted_price) # "1,234"
特に顧客向けシステムでは見栄えや分かりやすさが重視されるので、計算が完了したら書式を整えて文字列に変換する工程も大切になります。
数値変換に失敗するケースを確認しよう
数値変換が失敗する代表的なケースとして、文字列に想定外の文字が含まれている というものが挙げられます。 たとえばスペースやタブ、制御文字が混在していることもあるでしょう。
また、以下のような例もあり得ます。
str_value1 = "12.34.56" # ピリオドが2つ str_value2 = "1/2" # 分数表現 str_value3 = "¥1000" # 通貨マーク # そのままint()やfloat()を使うとエラー
このような場合はまず、変換前に文字列の中身をチェックし、想定外の文字を処理する必要があります。 ときには、入力段階でバリデーション(検証)を設けることも重要です。
数値変換の処理前には、入力値の形式を適切に確認しないと想定外のエラーにつながることがあります。
このように、ユーザーが自由に入力できるフォームや外部システムから渡されるデータが相手の場合は特に注意を払うようにしましょう。
isdigit() や isnumeric() で数字かどうかを判定
数値への変換を安全に行うための一つの手段として、str.isdigit()
や str.isnumeric()
などのメソッドを活用できます。
これらは文字列が数字として構成されているかどうかを真偽値で返してくれます。
value1 = "123" value2 = "12.3" value3 = "Ⅳ" # ローマ数字 4 print(value1.isdigit()) # True print(value2.isdigit()) # False print(value3.isdigit()) # False print(value3.isnumeric()) # True (Unicodeで数字とみなされる)
ただし、ピリオド(ドット)が入る小数などは isdigit()
では「False」と見なされます。
このように、何を数字とみなすのか定義が異なるメソッドがあるため、場面に応じて使い分けましょう。
文字列から数値に変換するときのよくあるトラブル例
ここでは、初心者の方が特に引っかかりやすい例をいくつか挙げておきます。
1. 前後に空白や改行が含まれている
例: " 100\n"
のようにスペースや改行が混ざっていると、エラーになることがあります。
-> strip()
メソッドで除去しましょう。
2. 文字列の途中に通貨記号や単位が混在している
例: "100円"
のように本来は数値であっても、文字が混ざっているパターン。
-> replace("円", "")
などで不要な文字を取り除いてから変換。
3. 数字に全角が混じっている
例: "100"
は見た目は数字でも全角文字として扱われる。
-> int("100")
はエラーになる可能性があります。必要に応じて全角→半角への変換処理を入れる。
4. 小数点がカンマで表現されている
例: "12,34"
のように国や地域によって少数の表記が異なる場合がある。
-> いったん置換などで「.」に統一する必要がある。
このような細かい部分を意識しておかないと、意外なところでエラーや想定外の挙動に直面してしまいます。
大きな数値の扱い方
Pythonでは整数型 int
が非常に大きな数にも対応しています。
ただし、float
には限界があるため、大規模データを扱う場合はどの程度の範囲が必要か考慮しなければなりません。
基本的に int
はメモリが許す範囲であれば極めて大きな値をサポートしています。
金融のように大きな数字を扱う一方で小数点以下の誤差が許されない現場では、前述の Decimal
を使用するか、桁数上限を決めて処理するような運用が一般的です。
big_str = "999999999999999999999999" big_int = int(big_str) print(big_int + 1)
このように桁数の多い文字列を変換しても、Pythonの場合はすんなり扱えます。 ただし計算速度やメモリ使用量の問題は残るため、必要に応じて最適化を検討することも大切です。
コード例:ユーザー入力を受け取り計算処理する
ここでは、実務でありがちな「ユーザーがフォームやコンソールから入力する値を数値に変換して、何かしらの計算を行う」という例を示します。
def calculate_discounted_price(price_str, discount_str): """ 割引後の金額を計算する関数 price_str: 価格(文字列) discount_str: 割引率(文字列, 例: '10' は10%割引) """ try: price = float(price_str) discount = float(discount_str) / 100.0 discounted_price = price * (1.0 - discount) return discounted_price except ValueError: return None user_price_input = "1500" user_discount_input = "10" result = calculate_discounted_price(user_price_input, user_discount_input) if result is not None: print("割引後の価格:", result) else: print("入力値が数値ではありません")
関数 calculate_discounted_price()
では、文字列として受け取った価格や割引率を float()
で数値に変換し、割引後の金額を返します。
もし数値に変換できないデータが渡されれば ValueError
で例外が発生し、None
を返すようにしています。
ユニットテストとの関連性
ここでは学習者向けに、ユニットテストにも触れておきます。 実務ではコードの動作を保証するため、変換処理が正しく動くかをユニットテストで確認することが多いです。 たとえば、正常な文字列を渡したら期待通りの結果を得られるか、間違った文字列を渡したら例外処理が実行されるか、などを検証します。
import unittest class TestConversion(unittest.TestCase): def test_int_conversion(self): self.assertEqual(int("10"), 10) def test_float_conversion(self): self.assertAlmostEqual(float("3.14"), 3.14) def test_value_error(self): with self.assertRaises(ValueError): int("abc") if __name__ == "__main__": unittest.main()
このように、必要なケースをテストすることで、予期しないバグやエラーを減らすことに繋がります。
文字列を数値に変換する際の設計上のポイント
実務でコードを書いていると、文字列から数値への変換手順は当たり前のように出てきます。 そのとき、以下のポイントを念頭に置いて設計すると、後から修正が発生しにくくなります。
入力段階でバリデーションを行う
入力された値が数値として妥当かどうかをユーザー側で事前チェックする。
例外処理をきちんと実装する
変換に失敗した場合の動作を明確にしておく。
変換後の値の型を明確に決める
整数として扱うか、小数を許容するか、精度が必要な場合は Decimal
を使うかなどを明確化。
通貨や単位など余計な文字が混在しないようにする
フォーマットとして扱う部分と、実際に計算したい部分を分離する。
こうした設計上のポイントを押さえておくことで、規模が大きなプロジェクトになってもスムーズに開発を進めやすくなります。
まとめ
ここまで、Pythonで「文字列から数値へ変換する」方法や、その背景となる実務的な活用シーン、そしてトラブルを回避する工夫について解説しました。
- 文字列を整数に変換するなら int()
- 小数点を扱うときは float() または Decimal
- 変換できない文字列を渡すと ValueError が起きるため、事前のチェックか例外処理が重要
- 実務では入力データのバリデーションや、通貨記号・全角などへの対応がよく発生
- エラーを起こさないよう try-except でコードを守る方法を検討する
Pythonは他の言語に比べると数値型に融通がきき、非常に大きな整数も扱えます。 ただし、文字列から数値へ変換する際には想定外のデータが混ざらないように十分注意してください。
文字列と数値の相互変換を理解することで、データの受け渡しから計算、表示までをスムーズにつなげることができます。
日々の業務や個人開発でも、ここで紹介した基礎知識が必ず役に立つはずです。 ぜひコード例を参考にしつつ、自分の開発環境で試してみてください。