6通貨の双方向換算と早見表・総当たり表の展開
本ツールは,USD(米ドル),EUR(ユーロ),JPY(日本円),GBP(英ポンド),CNY(中国元),AUD(豪ドル)の主要6通貨を対象として,入力した金額を双方向で換算します.画面の金額欄は,0以上1,000,000,000,000以下の有限な数値だけを受け付けます.
空欄,数値として解釈できない文字,負数,Infinityになる指数,上限を超える数値は個別に検査し,入力欄と関連付けたエラーを表示します.0は有効な金額として扱うため,空欄と0も区別されます.入力が無効な間は主結果をダッシュ表示にし,誤った換算額を示しません.
換算元と換算先はそれぞれ選択でき,中央の交換ボタンを押すと入力金額を変えずに通貨の向きだけを入れ替えます.例えば100 USDからJPYを見ている状態で交換すれば,入力欄の100はそのまま100 JPYとしてUSDへ換算されます.交換前の結果を換算後の入力へ自動転記する機能ではないため,往復換算を比較するときは金額の意味が変わる点に注意が必要です.交換ボタンには支援技術向けの名前も設定しています.
主結果のほかに,選択中の通貨ペアについて1,10,100,1,000単位を両方向に換算する早見表を表示します.さらに6通貨を行と列に並べ,行の通貨1単位を列の通貨へ換算した6×6の総当たり表を用意します.金額入力の変更が反映されるのは主結果で,早見表は定められた4金額,総当たり表は1単位の比率を表示します.
通貨選択または使用中のレートが変わると,主結果と各表が同じレート集合から再計算されます.表にはcaption,列見出し,行見出しを付け,横幅が狭い画面では横スクロールで確認できます.
ExchangeRate-APIを利用したレート取得と応答の一括検査
ページ表示時と更新ボタン押下時には,ブラウザからExchangeRate-APIのOpen Access endpointである https://open.er-api.com/v6/latest/USD へGETリクエストを送ります.このURLはUSD基準で固定され,入力金額や画面で選択した換算元・換算先通貨をクエリや本文へ追加しません.
Open Accessのデータは原則1日1回更新される参考用のレートであり,ボタンを押すたびに外国為替市場の秒単位の価格を取得する仕組みではありません.画面にも「API提供レート」と表示し,Rates By Exchange Rate APIから提供元サイトへの帰属リンクを掲載します.
受信したJSONは,HTTPの成功だけで採用しません.resultがsuccessであること,base_codeがUSDであること,ratesがオブジェクトであること,USD・EUR・JPY・GBP・CNY・AUDの6項目がすべて数値型の有限な正数であることを確認します.
さらにtime_last_update_unixが正の安全な整数であることを検査し,time_next_update_unixが存在するときは同じ条件で確認します.1通貨でも欠ける,文字列で返る,0・負数・NaN・Infinityを含む,更新時刻が不正であるといった応答は全体を拒否します.
有効な項目だけを固定値や過去値へ混ぜる部分採用をしないため,画面の6通貨は常に同じ応答から得た一組として扱われます.
提供元の最終更新Unix時刻は,Intl.DateTimeFormatを使ってAsia/Tokyoの日本時間へ変換して表示します.これはブラウザが応答を受け取った時刻ではなく,APIが示したレートデータの更新時刻です.取得処理には10秒のタイムアウトとAbortControllerを使い,コンポーネントを離れたときは未完了の通信を中止します.
リクエスト番号も照合し,古い要求の完了が新しい状態を上書きしないようにします.ただし,中止制御は提供元の稼働,通信成功,レートの新しさを保証するものではありません.取得中,成功元,エラーは画面上の状態とライブ通知で区別します.
USD基準のクロス換算式と用途別の表示丸め
APIと固定参考値はいずれも「1 USDが各通貨でいくらか」を表すUSD基準のレート集合です.任意の通貨間では,換算元金額を換算元のUSD基準レートで割ってUSD相当へ戻し,その値へ換算先のUSD基準レートを掛けます.式は「換算結果 = 入力金額 ÷ 換算元通貨のUSD基準レート × 換算先通貨のUSD基準レート」です.
通貨ごとの直接レートを36通り保存したり,複数経路を探索したりするのではなく,同じ2段階の式で6通貨の組み合わせを求めます.巨大な有限レートによる計算結果がオーバーフローした場合は,描画エラーを発生させずに「—」を表示します.
例えば固定参考値のUSD=1,JPY=158.5を使う状態では,100 USDからJPYは100 ÷ 1 × 158.5 = 15,850 JPYです.固定参考値のJPY=158.5,EUR=0.92で50,000 JPYからEURを求める場合は,50,000 ÷ 158.5でUSD相当へ直し,その値へ0.92を掛けるため約290.22 EURになります.
これらは固定値による計算例であり,実画面がAPI提供レートを取得できた場合の結果と一致するとは限りません.同一通貨同士では同じレートで割って掛けるため,換算値は入力金額と同じになります.
計算はJavaScriptのNumber型,すなわちIEEE 754の倍精度浮動小数点で行います.十進専用の高精度ライブラリや多倍長整数は使っていません.Number.isFiniteで入力とAPIレートを検査し,計算後も有限値かを確認します.1兆の入力上限は過大な値を制限しますが,二進浮動小数点に由来する微小な丸め誤差まで排除するものではありません.
表示では用途別に桁数を変えます.主結果と早見表の金額はIntl.NumberFormatで整形し,JPYは小数なし,その他5通貨は小数2桁を表示します.1単位レートはtoFixed(4)で一律に小数4桁,総当たり表は100以上の値を小数2桁,100未満を小数4桁で表示します.
Intl.NumberFormatやtoFixedが返すのは表示用文字列であり,内部の計算値そのものを表示桁へ書き換えてから次の換算に使うわけではありません.そのため,画面で丸められた数値だけを使って手計算すると,内部値から計算した別の表示と末尾がわずかに異なる場合があります.
固定参考値,直前API値の保持,タイムアウトとエラー表示
画面は最初にUSD=1,EUR=0.92,JPY=158.5,GBP=0.79,CNY=7.26,AUD=1.5というコード内の固定参考値を表示しながらAPI取得を開始します.この6値は通信前にも計算画面を確認できるようにする静的な参考値で,取得日時,市場の現在値,取引可能価格を示すものではありません.
初回API取得が成功し,Unix秒がJavaScriptのDate有効範囲を超える値の拒否を含む応答検査をすべて通過した場合にだけ,6通貨分を一度にAPI提供レートへ置き換え,提供元の更新時刻を表示します.
初回取得が通信エラー,HTTPエラー,JSON異常,必須レート欠落,異常値,または10秒のタイムアウトで失敗した場合は,固定参考値を維持し,固定値を使用していることと取得失敗を画面に示します.一度API提供レートを取得した後で手動更新に失敗した場合は,そのタブのメモリにある直前の有効なAPI値を捨てずに維持します.
失敗した応答から一部だけを混ぜず,エラー文で直前値を維持していることを伝えます.再度更新ボタンを押せば取得を試せますが,処理中はボタンを無効化して重複操作を抑えます.
本ツールにはlocalStorage,IndexedDB,サーバー側データベースによるレートの永続キャッシュはありません.直前のAPI値を保持する範囲は,現在開いているページのReact状態だけです.ページを再読み込みすると固定参考値から始まり,改めてAPIへ取得を試みます.
固定参考値を「オフライン保証」とは呼ばず,ページ本体の読み込みや外部APIなしで常に利用できることも保証しません.エラーを開発者用ログだけへ隠す構成ではなく,利用者がAPI値か固定値か,更新が失敗したかを画面で判断できる状態表示にします.
参考用中間レートと実際の両替・決済額の違い
ExchangeRate-APIは,複数の情報源から合成した値を参考用の中間為替レートとして説明しています.Open Accessの値は原則24時間ごとの更新で,外国為替市場の刻々と変わるbidやaskを配信するものではありません.銀行が特定時刻に定める仲値,金融機関のTTS・TTB,両替所の店頭価格,FXで約定できる気配値と同一であるとは説明できません.
外部APIから提供される原則1日1回更新の参考レートを使用しており,実際の取引に利用可能な価格ではありません.
表示する換算額には,bidとaskの差であるスプレッド,銀行や両替所の為替手数料,カード会社の外貨取扱手数料,カードネットワークの換算条件,海外送金手数料,受取手数料,税,送料,関税を加えていません.また,購入時とカード会社の処理時,送金指示時と着金時の時刻差によって適用レートが変わる可能性も計算しません.
例えば参考レート上の100 USDが15,000 JPYでも,カード請求額が必ず15,000円になるという意味ではありません.実際の金額は利用する銀行,カード,送金サービス,店舗が示す確定条件で確認する必要があります.
本ツールは将来レートの予測,相場の異常検知,両替時期の推奨,為替差損益,会計上の適用レート,ヘッジ判断を行いません.旅行予算や商品価格を同じ参考条件で概算する,異なる通貨の桁感を確認する,サービス事業者が提示した換算額と比較する前段階に使えますが,金融助言,FX取引,確定申告,決算処理の根拠にはできません.
必要な用途では,更新時刻とレート元を記録し,金融機関や会計専門家が指定する公式資料で再確認してください.
ブラウザ内の金額計算と外部API通信の境界
入力した金額,換算元通貨,換算先通貨は現在のページのReact状態としてブラウザのメモリに保持され,換算式もブラウザのJavaScriptで実行されます.固定のAPI URLへ送るGETリクエストのURLや本文に,入力金額や選択中の通貨ペアを追加しません.金額をZeroTools独自の換算APIやデータベースへ保存する処理もなく,ページを再読み込みすると入力や選択状態は初期値へ戻ります.
一方で,為替レートを取得するための外部通信そのものは発生します.ブラウザがExchangeRate-APIへ接続すると,接続元IPアドレスやOrigin,User-Agent,Referer等のHTTP通信情報が,API提供元またはCDN等の配信基盤へ伝わる場合があります.
どの情報が実際に保存されるかまで本ツールから断定はできません.したがって,「入力金額を固定USD URLへのリクエストに含めない」ことと,「一切の外部通信がない」ことは分けて説明します.完全ローカル,完全オフライン,外部送信ゼロという表現は使いません.
結果をメモや資料へ転記するときは,通貨ペア,換算元金額,画面に表示されたAPI提供元の更新時刻,API値か固定参考値かを一緒に記録すると,後から前提を確認しやすくなります.固定参考値を使用中なら現在相場の記録として扱わず,API提供レートの場合も実際の決済条件とは分けます.
このように,計算場所,外部通信,レートの出所,表示丸め,実取引との差を切り分けて読むことで,本ツールを参考換算の範囲内で再現可能に利用できます.