blog
ブログ

Salesforce技術ブログ:数式で「カンマ区切り」「千円」「円銭」を表現するソースを公開します!

ハロー、ハリーくめです

12月になりましたね。
年賀状を出す人は減っているようですが、皆さんは年始の挨拶は何を利用しますか?
私は枚数は少ないものの年賀状を描いています。
干支の絵を考えて、その人へのコメントを少し書くという一連のイベントが結構好きなんですよね。

さて、今回は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倍したり、テキストとして評価したりして、うまく工夫してみてください。

文字数の制限さえクリアすれば、数式って色々できるもんなんですよね。

では、また次回。

contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳