nashornでtoLocaleString()が使えない件

こんにちは、開発担当の Masa です。

先日、Javascript(nashornスクリプトエンジン使用)で数値をカンマ区切りの文字列に変換しようとして「toLocaleString()」を使ったのですが、残念ながら機能しませんでした。
正規表現で対応した話と、「rhino」「GraalJS」は対応しているのかについて調べた結果をお話します。

Javascript で数値をカンマ区切りの文字列に変換する一番簡単な方法は「toLocaleString()」を使うことです。

print(Number(123456789).toLocaleString() + '円');

Java 17 + nashorn 15.3 で実行したところ、結果は「123456789円」。
「NativeNumber#toLocaleString」のコードを見るとそのまま文字列にして返してるだけなので、当然の結果ですね。

仕方がないので正規表現で対応しました。

print('123456789'.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1,') + '円');

無事「123,456,789円」になりました。

「rhino」「GraalJS」の対応状況ですが、「GraalJS」は使えました。
実行時の環境は Java 17 + GraalJS 23.0 です。

「rhino」は「nashorn」と同じで対応していません。
「NativeNumber#execIdCall」のコードを見るとそのまま文字列にして返してるだけですね。
実行時の環境は Java 17 + rhino 1.7.14 です。