Принудительный десятичный разделитель с использованием интерполятора строки f в Scala

Я пытаюсь составить форматированную строку, которая должна выглядеть так:

Бутылка водки стоит x.yz рублей.

где x.yz — произвольное значение типа Double, округленное до 2 знаков после запятой.

Для этого я использую интерполяцию строк с синтаксисом printf:

val cost = 2.56
val str = f"A bottle of vodka costs $cost%.2f rubles."

К сожалению, на машине с русской локалью фрагмент выше дает результат, который немного отличается от того, чего я хочу добиться:

str: String = Бутылка водки стоит 2,56 рубля.

Это понятно (форматтер Java, используемый интерполятором f, применяет десятичный разделитель для конкретной локали, как указано здесь), но я все же хочу использовать десятичную точку вместо запятой.

Мне известен возможный обходной путь — использование метода formatLocal() с явно установленной локалью:

 val str = "A bottle of vodka costs %.2f  rubles.".formatLocal(java.util.Locale.US, cost)

но это не кажется мне особенно Скалаевским способом делать вещи.

Итак, мой вопрос таков: возможно ли отформатировать строку с определенным десятичным разделителем, используя только интерполяцию f без каких-либо посторонних вызовов методов?


person Voidy    schedule 07.09.2016    source источник
comment
@WiktorStribiżew, спасибо! Обратите внимание, однако, что мой вопрос ограничен использованием произвольного десятичного разделителя; Меня не интересует смена локали.   -  person Voidy    schedule 07.09.2016


Ответы (1)


На данный момент интерполятор f не поддерживает локали и пользовательские разделители (см. macro_StringInterpolation_f.scala / FastTrack.scala).

person dveim    schedule 07.09.2016
comment
Из того, что я почерпнул из исходного кода Scala на GitHub, это кажется правдой (хотя и немного разочаровывает) . Спасибо! - person Voidy; 12.09.2016