値段の表示が国際化されるときに調査した内容のメモ
- サーバーもNode.jsだったので
Intl.NumberFormat
を存分に利用した- MDN: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat
- 対応していれば通貨記号なども出せるのでとても便利
- 対応していない通貨だと通貨記号の代わりに通貨コードが表示される
- 通貨コード: https://www.iban.jp/currency-codes
- ただし為替レートや決済のSaaSで対応数に限界があるので、上記をすべて利用することはないはず
- 通貨の補助単位
- 決済サービス: https://stripe.com/jp
- サポートしている通貨: https://stripe.com/docs/currencies
- APIのパラメータ
amount
が整数値しか受け付けないので上記の補助単位の桁数を利用して変換する必要がある
- 為替レートを取得するAPIのサービス: https://openexchangerates.org/
- 送金サービス: https://www.payoneer.com/ja/
- 当初はTransferWiseを使おうとしたが、日本法人のビジネス利用はできなかった
- ヨーロッパに法人を持っていないと使えない
- もともとはStripe Connectを使っていたが海外ユーザーへの送金をするためには審査が必要
- 審査には1か月ほど時間がかかる。我々の場合は審査結果の通知が結局されなかった
- 国を跨いでの送金を利用している日本のサービスは滅多にないらしい
- また送金する金額(
currency
)がホストアカウントの通貨で指定しないといけないので送金後の金額をユーザーに合わせて指定することができなかった
- 当初はTransferWiseを使おうとしたが、日本法人のビジネス利用はできなかった
- 数値誤差が結構発生するので
Math.round()
のよりよい解決策を参考にして回避80.7 - 10.1 // = 70.60000000000001
round(80.7 - 10.1, 2) // = 70.60
- 通常のNode.jsだと
Intl.NumberFormat
はまともに使えない- https://nodejs.org/api/intl.html
- 自前でビルドするのが面倒な感じだったのでintlパッケージを利用した
global.Intl.NumberFormat = require("intl").NumberFormat
のようにIntl
を丸ごと入れ替えるのは得策ではない- 丸ごと入れ替えてしまうと(自動テストで判明したが)
Luxon
などのライブラリーがIntl
に依存していてタイムゾーン周りの計算が正しく動かなくなった
NumberFormat.prototype.formatToParts()
がSafariで対応してなかった- iOS 13から対応したらしい
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/formatToParts
- 実装した当時は
format()
と正規表現で分解を頑張った