必見!数式で「カンマ区切り」「千円」「円銭」を表現するソースを公開します!
こんにちは!
今回はSalesforceの数式について最近使った小ネタを紹介します。
帳票などを作成するときに、 Salesforceで「1,890千円」「1,200円68銭」といった「カンマ区切り」「千円」「円銭」を表現しなくてはいけない時に参考にしてみてください。
数式を軽く振り返る
その前に今回使う関数について軽くおさらいをしておきましょう。
関数 | 概要 | 例 |
CEILING(number) | 数値をもっとも近い整数に丸めます → 切り上げ | ・CEILING( 100.555 ) = 101 ・CEILING( 100.444 ) = 101 |
FLOOR(number) | 数値を切り捨てて、0 にもっとも近い整数に丸めます → 切り捨て | ・FLOOR( 100.555 ) = 100 ・FLOOR( 100.444 ) = 100 |
ROUND(number,num_digits) | 数値を指定した桁数に丸めます → 四捨五入 | ・ROUND( 100.555, 0 ) = 101 ・ROUND( 100.444, 0 ) = 100 |
MOD(number,divisor) | 数値を因数で除算した余りを返します → 除算は正の値だけ行われます | ・MOD( 10, 3 ) = 1 ・MOD( 100.555, 5 ) = 0.555 |
LEN(text) | テキスト文字列の文字数の文字を返します | ・LEN( TEXT(100.555) ) = 7 |
数値項目(15,3)を「カンマ区切り」かつ「千円」単位で表示する
千円で表示するために一度、1/1000にしてから四捨五入します。
状況によって切り上げ、切り捨てに変更してください。
※数値が格納されているオブジェクトの項目は「Price__c」です。
IF(
ROUND(Price__c / 1000,0) < 1,
ROUND(Price__c) + "円",
MID(
TEXT(Price__c / 1000),
1,
IF(
MOD(
LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
3,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3)
)
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>3,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
4,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-1)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>6,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
7,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-4)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>9,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
10,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-7)
),
3
),
""
) & "千円"
)
数値項目(15,3)を「カンマ区切り」かつ整数部分を「円」単位、小数点以下を「銭」単位で表示する
銭まで表示する場合小数点第3位で四捨五入を行うため、円表記部分には小数点以下を切り捨てた値を使用します。
※こちらも、数値が格納されているオブジェクトの項目は「Price__c」です。
IF(
ROUND(Price__c,0) < 1,
"0",
MID(
TEXT(FLOOR(Price__c)),
1,
IF(
MOD(
LEN(TEXT(ROUND(Price__c,0))),3)=0,
3,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3)
)
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>3,
," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
4,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-1)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>6,
"," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
7,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-4)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>9,
"," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
10,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-7)
),
3
),
""
)
)
& "円" &
IF(
FIND('.', TEXT(Price__c)) = 0,"00",RPAD(MID(TEXT(Price__c), FIND('.', TEXT(Price__c))+1, 2), 2, "0")
)
& "銭"
今回の数式を使う際には、小数点第3位に関して切り上げ切り捨てをする必要がある場合は100倍したり、テキストとして評価したりして、うまく工夫してみてください。
文字数の制限さえクリアすれば、数式って色々できるもんなんですよね。
では、また次回。