
度分秒と十進度の入力UIをどう作るか — MAUIフォーム設計
以前、GeoConverterPro(GCVP)ブログで度分秒(DMS)と十進度(DD)の相互変換という記事を書きました。あちらは「DMSとDDは同じ角度の別表記」という概念の整理が中心でしたが、今回は視点を変えて、GeoDiveExa(GDE)の.NET MAUIアプリで実際に入力フォームをどう作っているかという実装側の話です。概念を押さえていても、入力欄の設計はまた別の悩みが多いところです。
入力欄で起きる「概念では見えない」問題
DMSとDDが同じ角度の別表記だと理解していても、実際の入力欄(Entry)を作ろうとすると、次のような問題に直面します。
- ユーザーがどちらの表記で入力してくるか、入力欄だけでは分からない
- コピー&ペーストで、区切り記号(°′″)が全角・半角混在で入ってくることがある
- 小数点がカンマ表記(他言語ロケール由来)になっているデータが貼り付けられることがある
- 入力途中の状態(例えば「35°39」まで打った状態)でリアルタイム検証をかけると、誤ってエラー表示になってしまう
概念としての変換式はシンプルでも、現場でユーザーが実際に入力する文字列は思ったよりも揺れるというのが、UIを実装して最初に感じたことでした。
入力形式の自動判定
MAUIのフォームでは、DMS用とDD用で入力欄を分けるのではなく、1つの入力欄にどちらの表記で入力されても受け付ける方式を採っています。判定の流れは次のとおりです。
- 入力文字列から度記号・分記号・秒記号(°′″、または全角の゜など)を検出する
- 区切り記号が見つかれば DMS 表記として、度・分・秒に分割してパースする
- 区切り記号が見つからず、数値としてそのままパースできれば DD 表記として扱う
- どちらの形式でも解釈できない文字列は、そのままではエラーとせず「保留」として扱い、次の入力を待つ
区切り記号の判定では、度記号だけ全角・半角の両方を許容するようにしています。スマートフォンやWeb上の資料からコピーした文字列には、全角の記号が混ざっていることが少なくないためです。
リアルタイムバリデーションの罠 — 入力途中を誤検知しない
Entry の TextChanged イベントでその場でバリデーションをかける場合、入力が完了する前の状態を誤ってエラー扱いしないという配慮が必要でした。
たとえば「35°39」まで入力した時点では、まだ秒の部分が入力されていないため、完全なDMS表記としては不完全です。ここで即座に赤いエラー表示を出してしまうと、入力中のユーザーに不要なストレスを与えてしまいます。
そこで、バリデーションを次の2段階に分けています。
- 入力中の緩い検証:明らかに使えない文字(アルファベットなど)が入力された場合のみ、その場で警告を出す
- フォーカスが外れた時点の厳密な検証:入力欄からフォーカスが外れたタイミングで、初めて「DMSでもDDでも解釈できない」という厳密なエラー判定を行う
この2段階に分けたことで、入力途中の自然な状態ではエラー表示が出ず、入力を終えたタイミングでだけ最終的な妥当性チェックが働くようになりました。
コピー&ペースト対応 — 符号と半球表記の揺れ
DMS/DDの相互変換における符号(南緯・西経のマイナス表記)と同じ問題は、入力UIでも起きます。資料によっては、緯度・経度の末尾に「S」「W」のような半球記号が付いていたり、逆に先頭にマイナス記号が付いていたりと、表記のバリエーションが複数あります。
入力欄では、こうした半球記号とマイナス符号の両方を受け付けたうえで、内部的には符号付きの数値に正規化してから変換処理に渡すようにしています。表示上は元の表記に近い形を保ちつつ、内部の計算ロジックには常に同じ形式のデータだけが渡るようにする、という役割分担です。
まとめ
- DMS/DDの変換式そのものはシンプルだが、実際の入力欄では表記の揺れ(全角・半角の区切り記号、カンマ小数点、半球記号)への対応が実装の主な悩みどころだった。
- 1つの入力欄でDMS/DDどちらの表記も受け付け、区切り記号の有無で自動判定するようにしている。
- リアルタイムバリデーションは「入力中の緩い検証」と「フォーカスが外れた時点の厳密な検証」の2段階に分け、入力途中の誤検知を防いでいる。
- 符号・半球記号の表記揺れは、内部的に符号付き数値へ正規化してから変換ロジックに渡す形で吸収している。
関連記事
- 度分秒(DMS)と十進度(DD)の相互変換 — 座標の「書き方」でつまずかないために(GeoConverterPro)
- C#で測地計算の単体テストを書く — 検証値ドリブン開発
- 座標変換エンジンをSwiftとC#で二重実装する — 結果一致の保証
開発者より: アプリ・Kindle本・オープンソースの一覧は GitHub: amru195704 にまとめています。
お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、コメント欄よりご指摘いただければ、確認のうえ修正いたします。

コメントを残す