プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

JavaScriptでMessageFormatのように文字列の置換をする方法と例

  • 2020年1月31日
  • 2020年6月14日
  • JavaScript
  • 2334view
  • 0件

JavaScriptでjavaのMessageFormatを使う

はじめに

javaのMessageFormatって便利ですよね。
この記事では、 javaのMessageFormatと同様のことをnode.jsでやるならどういった方法があるのか調べたので紹介していきます。

JavaScriptでやりたいこと

例えば、処理失敗時の表示。
「エラーコード{0}エラー内容{1}」のように、
定数化された文字列内にパラメータを与えることで、汎用的に共通関数化するのが目的です。

JavaScriptで疑似MessageFormatを作るために試した3つの方法

javaのMessageFormatを再現するために、まずは以下の3をやってみました


① Template literalを使った方法
② npmのパッケージを使った方法
③ 自作関数での方法

それぞれ紹介していきます。

① Template literalを使った方法

  function template(strings, ...keys) {
    return (function(...values) {
      var result = [strings[0]];
      keys.forEach(function(key, i) {
        var value = values[key];
        result.push(value, strings[i + 1]);
      });
      return result.join('');
    });
  }
  
  message = template`こんにちわ${0}。今日の天気は${1}ですね`
  var genarateMessage = message;
  console.log(genarateMessage('あなた', '晴れ'))

こんな感じでやるとできました。

ただ、例えlogだとしても処理中に文字列を書きたくなくて、定型文はjsonファイルに定義してそれを読み込むようにしたかったので、完全ではないです。

② npmのパッケージを使った方法

※これはうまくいかなかったです。
npmにmessage-formatというのがあったので、これを使えばサクッとできるのではと思いましたが、結果うまくいかず。一応記録として。

まずは以下コマンドでプロジェクトにパッケージをインストール

npm i -s message-format

message-format@6.2.3(バージョンは執筆辞典)と返ってくればインストール完了。

使い方

使いたいjsファイルの先頭でmessage-formatを読み込みます。

var MessageFormat = require('message-format');

メッセージを表示させたい箇所で以下のように記述します。

  var message = new MessageFormat('en', 'Hello {0}!');
  var formatted = message.format({ 0:'World' });
  console.log(formatted)

手順としてはこれだけ。

ドキュメントにはいろいろ書いてありますがどうやらフォーマットが欠落しているのが原因のエラーのよう。これに時間を使うより他の方法を試したので、こちらの成功例はありません。
もし上手く行った方で便利だよーという意見があればぜひ教えてください。

③ 自作関数での方法

この程度のやりたいことなら最初からこれで良かったかもしれません。

 function generateMessage(mes,param){
    let result
    for(i=0; i < param.length; i++){
      let index = "{" + i + "}"
      result = mes.replace(index,param[i])
    }
    return result
 }

  let mes = "これはテスト{0}です{1}"
  let param = ["123","456"]

  let result = generateMessage(mes,param)
  console.log(result)

これでgenerateMessageをどこか共通関数として外出ししておけばいつでも呼び出せますね。

さいごに

今回はJavaScriptでMessageFormatのように文字列の置換をする方法を書いてみました。結果的には関数作っておくというのが一番手っ取り早かったですね。

ちなみにJAVAなら以下のようにして簡単に読み込むことができます。

Test.java

import java.text.MessageFormat;
~~
public static String generateMessage(String message, String[] params) {
MessageFormat mf = new MessageFormat(message);
return mf.format(params);
}
~~

Main.java

String[] param = {hoge, fuga}
Test.generateMessage(Message.testmessage,param)