int→stringのキャストについて質問です。
int→stringにキャストする時、
{(xxx asa int).to-String}
が使えないことがあります。
この場合、僕はいつも{String xxx asa int}でキャストしてます、、、
どのような場合、{(xxx asa int).to-String}が効かなくなるんでしょうか?
僕は int -> String には format などを使いますね。
私は、xxx & ""を使いますね。
ちなみに、formatよりこっちの方が相当高速です。ただ、コードが汚なくなるかもしれないですが・・。
Code:
def xxx:int = 123
def s1 = xxx & ""
def s2 = {format "%d", xxx}
def s3 = {String xxx}
|| s1, s2, s3は一緒の文字列。
int型はクラスではなくプリミティブデータ型なので、メソッドを持っていないですからね
intからStringへの変換は以下のいずれでも実現可能ですが、
開発のプロジェクトで決めている作法に乗っ取るのが一番いいかと思います。
{format "%d",intValue}
{String intValue}
""&intValue
int 等の数値型以外でも、BigDecimal なども文字列に変換したいことは多いです。
こんなコードを考えてみましたが、DateTime の文字列化のロジックが貧相。
Code:
{import * from COM.CURL.ORB.TYPE}
{import * from CURL.LANGUAGE.REFLECTION}
{define-proc public {get-String c:any}:#String
let str:#String = null
{if c isa DateTime then
set str = (c asa DateTime).info.locale-full
else
{type-switch {type-of c}
case num:NumericType do
set str = c & ""
else
{for m in {({type-of c} asa ClassType).get-members
filter = ClassMember.method-filter
}
do
{switch m.name
case "to-String", "get-text" do
set str = {(m asa Method).invoke c} asa #String
{break}
}
}
}
}
{return str}
}
{CommandButton
label = "オブジェクトを文字列にする",
{on Action do
{popup-message
{VBox
{get-String 6 asa int},
{get-String 6.7 asa double},
{get-String 'a' asa char},
{get-String false asa bool},
{get-String "String"},
{get-String {DateTime}},
{get-String {Frame "Frame内の文字" }},
{get-String {CTimestamp.value-of "2013-01-01 10:10:10" }},
{get-String {BigDecimal.from-String "2013" }}
}
}
}
}
to-*** メソッド、 from-*** コンストラクタ が利用できるなら、下記のようなコードも使えるかも。
Code:
{define-proc public {data-to-data-with-type-change
to-val:any,
from-val:any
}:any
{if-non-null
to-val, from-val then
def to-type = {type-of to-val} asa ClassType
def to-type-name = to-type.name
def from-type = {type-of from-val} asa ClassType
def from-type-name = from-type.name
{if-non-null mtd = {from-type.get-method "to-" & to-type-name} then
{return {mtd.invoke from-val}}
}
{if-non-null cns = {to-type.get-constructor "from-" & from-type-name} then
{return {cns.new}}
}
}
{return null}
}
グリッドに入力されたセルの内容を形式チェックする機能を用意していて、
チェックエラー時には、エラーの内容を表示したいので、domain はString にせざるを得ないのですが、
ORB で、送受信するためのDTOの型はBigDecimal なので、
値を詰め替えるときに自動で型を変換できるようにしています。