数値を金額表示の文字列に変換するには?: Notion Formula 解説 (35)

はじめに

Notion Formula の第35回目は、「数値を金額表示の文字列に変換するには?」を解説します。この例については、こちらの逆引きで紹介しています。

数式

数式は以下のようになります。長いので1行ずつ解説しましょう。

/* 数値の先頭に3つの@を付加(自動的に文字列に変換) */
("@@@" + prop("数値"))
  /* 3の倍数の長さになるように substring で切り出し */
  .substring(prop("数値").length() % 3)
  /* 頭から3桁ごとに, を付加 */
  .replaceAll("(.{3})", "$1,")
  /* 頭の@と,(ある場合だけ)を¥マークに置換 */
  .replace("^@+,?", "¥")
  /* 末尾の , を削除 */
  .replace(",$", "")

今回の Notion Formula 解説をやったおかげで以前のものからさらに短くなりました。以前は、最初に数値を format() で文字列に変換し、n という変数に代入していました。数値プロパティの値は文字列と加算すると自動的に暗黙の format() が呼ばれることがわかったので、let の代入は消しました。

/* 数値の先頭に3つの@を付加(自動的に文字列に変換) */
("@@@" + prop("数値"))
Name 数値 "@@@" + prop("数値")
0 0 @@@0
1桁 1 @@@1
2桁 12 @@@12
3桁 123 @@@123
4桁 1234 @@@1234
5桁 12345 @@@12345
6桁 123456 @@@123456
7桁 1234567 @@@1234567

次に長さが全て3の倍数になるように揃えます。ここでも length() は文字列に対するメソッドなので、暗黙の format() が呼ばれ、文字列とした場合の長さが返ります。これを 3 で割ったあまりの位置から切り出すことで、全て3の倍数の長さの文字列になります。

  /* 3の倍数の長さになるように substring で切り出し */
  .substring(prop("数値").length() % 3)
Name prop("数値").length() %3 substr
0 1 1 @@0
1桁 1 1 @@1
2桁 2 2 @12
3桁 3 0 @@@123
4桁 4 1 @@1234
5桁 5 2 @12345
6桁 6 0 @@@123456
7桁 7 1 @@1234567

長さが揃ったので、3文字ごとに「,」をつけていきます。ここで . は任意の一文字を示し、 {3} でそれらが3つ揃ったものにマッチします。それらが () で括られているので、この部分がメモ化されます。置換文字列の方では、一番目にメモしたものが $1 で取り出され、その後ろに「,」が付けられます。

  /* 頭から3桁ごとに, を付加 */
  .replaceAll("(.{3})", "$1,")
Name repalceAll 前 repalceAll 後
0 @@0 @@0,
1桁 @@1 @@1,
2桁 @12 @12,
3桁 @@@123 @@@,123,
4桁 @@1234 @@1,234,
5桁 @12345 @12,345,
6桁 @@@123456 @@@,123,456,
7桁 @@1234567 @@1,234,567,

あとは邪魔な @ を削除します。 @ が三つの場合には余計な,が入っているので、それも削除します。先頭 (^)から @ が1文字以上(+)、, が 0文字か1文字 (?)のものを円記号("¥" )に変換します。

  /* 頭の@と,(ある場合だけ)を¥マークに置換 */
  .replace("^@+,?", "¥")
Name repalce 前 repalce 後
0 @@0, ¥0,
1桁 @@1, ¥1,
2桁 @12, ¥12,
3桁 @@@,123, ¥123,
4桁 @@1,234, ¥1,234,
5桁 @12,345, ¥12,345,
6桁 @@@,123,456, ¥123,456,
7桁 @@1,234,567, ¥1,234,567,

最後に末尾の , を消せば終了です。

  /* 末尾の , を削除 */
  .replace(",$", "")
Name repalce 前 repalce 後
0 ¥0, ¥0
1桁 ¥1, ¥1
2桁 ¥12, ¥12
3桁 ¥123, ¥123
4桁 ¥1,234, ¥1,234
5桁 ¥12,345, ¥12,345
6桁 ¥123,456, ¥123,456
7桁 ¥1,234,567, ¥1,234,567

おわりに

今回は「数値を金額表示の文字列に変換するには?」を解説しました。文字列を取り扱う際には、正規表現による置換処理はかなり便利に使えますね。