【Salesforce】ApexでDecimalをMapのKeyにした際の動き
SalesforceのMapでKeyにDecimal型を設定して値を取得しようとしたところ、意図しない挙動をしたのでメモです。
動きとしては、「10」でも「10.0」でも「+10.00」を返してくれると思っていました。
ところが、実際の動きとしては小数点以下の桁数まで一致しているもののみ、Keyが一致しているということになりました。
// Decimalの値からStringの値を取得するMap Map<Decimal, String> getStrMap = new Map<Decimal, String>(); getStrMap.put(10, '+10.00'); system.debug(getStrMap.containsKey(10)); // true system.debug(getStrMap.get(10)); // +10.00 system.debug(getStrMap.containsKey(10.0)); // false system.debug(getStrMap.get(10.0)); // null system.debug(getStrMap.containsKey(10.00)); // false system.debug(getStrMap.get(10.00)); // null
Keyの型をDecimalからDoubleに直すことで解決することができました。
// Decimalの値からStringの値を取得するMap Map<Decimal, String> getStrMap = new Map<Decimal, String>(); getStrMap.put(10, '+10.00'); system.debug(getStrMap.containsKey(10)); // true system.debug(getStrMap.get(10)); // +10.00 system.debug(getStrMap.containsKey(10.0)); // false system.debug(getStrMap.get(10.0)); // null system.debug(getStrMap.containsKey(10.00)); // false system.debug(getStrMap.get(10.00)); // null
Decimal型は小数点以下の桁数まで保持しているということでしょうか。
一応、こんな確認もしてみました。
Decimal a = 10; Decimal b = 10.0; Decimal c = 10.00; system.debug(a); // 10 system.debug(b); // 10.0 system.debug(c); // 10.00 system.debug((double)a); // 10.0 system.debug((double)b); // 10.0 system.debug((double)c); // 10.0
何にしても、注意しなければいけないことはわかりました。
そもそも、MapのKeyにInteger以外の数値を使うのもあまり良くないのかもしれませんね。
No comments.