「坪」の換算率を追加する
上のGetConversionDataメソッドを見ると、Area_SquareMeter(平方メートル)に1をセットしていることから、平方メートルを基準にした換算率を設定すればよいと分かります。また、Area_SquareCentimeter(平方センチメートル)に0.0001がセットされていますから、「1平方センチメートルは0.0001平方メートル」というように指定すればよいことも分かります。
1坪は、121分の400平方メートル(=約3.3平方メートル)です。その定義を次のコードのように追加します。
void UnitConverterDataLoader::GetConversionData(_In_ unordered_map<ViewMode, unordered_map<int, double>>& categoryToUnitConversionMap)
{
/*categoryId, UnitId, factor*/
static const vector<UnitData> unitDataList = {
{ ViewMode::Area, UnitConverterUnits::Area_Acre, 4046.8564224 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareMeter, 1 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareFoot, 0.09290304 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareYard, 0.83612736 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareMillimeter, 0.000001 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareCentimeter, 0.0001 },
// 「坪」を追加
{ ViewMode::Area, UnitConverterUnits::Area_Tsubo, 400.0 / 121.0 },
{ ViewMode::Area, UnitConverterUnits::Area_SquareInch, 0.00064516 },
……省略……
上でUnitConverterUnits::Area_Tsuboというのは、「『坪』の定義を追加する」のところで追加した定数です。また、定義を追加する場所は、unitDataListの初期化コードの中ならどこでもよいです。
完成
これでようやくビルドが通るようになります。デバッグ実行してみてください。するとどうでしょう、選択肢に[坪]が表示されただけでなく、他の単位との換算もできています(次の画像)。
中:[坪]を選択すると換算される
右:逆方向の換算もできる
「坪」の換算率の定義を追加しただけですが、ロジックは指定された単位に対応した換算率を自動的に取り出して計算してくれるようですね。ロジックに「坪」のための分岐を追加したりする必要はありませんでした。
実際に換算するロジックは?
ちなみに、実際に換算を実行するロジックはCalcManager/UnitConverter.cppにあります(次の画像)。
画面でボタンが押されると、ビューモデルのUnitConverterViewModelクラスにあるOnButtonPressedメソッドが呼び出され、そこからモデルのUnitConverterクラス(上の画像)のSendCommandメソッド(上の画像の上段)が呼び出されます。そのSendCommandメソッドから呼び出されるCalculateメソッド(上の画像の中段)が変換ロジックの中核です。このCalculateメソッドでどのような変換をするか決定し、必要なだけConvertメソッド(上の画像の下段)を呼び出します。Convertメソッドでは、値にオフセットを加算するか、値に換算率を掛け合わせます。今回の「坪」では値に換算率を掛けるだけですが、例えば摂氏と華氏の変換ではオフセットの加減算もあります。
