Java: возможно ли обмен валюты с локальным отображением?
У меня есть значение, хранящееся в БД, соотносящееся с денежной суммой, например 10.0. У меня также есть доступ к Currency/CurrencyCode. Как я могу использовать NumberFormat/DecimalFormat/(другое?) Для форматирования, когда я не знаю Locale? Согласно документам, он выберет стандартную локаль, которая не будет работать с иностранной валютой.
Ответы
Ответ 1
Правильное поведение, вообще говоря, состоит в том, чтобы отформатировать сумму в предпочитаемом пользователем регионе, а не в типичной для валюты валюте. На стороне клиента вы будете иметь предпочтение пользователя (Locale.getDefault()); если вы делаете что-то на стороне веб-сервера, используйте язык Accept-Language или, желательно, язык контента страницы, чтобы получить правильную локаль.
Мотивировка такова:
Англо-американский пользователь поймет € 10,000,000.15, но не подходящий для Германии эквивалент, € 10.000.000,15
Сама валюта не содержит достаточной информации, чтобы вывести подходящий языковой стандарт.
Ответ 2
JasonTrue верен, но вы можете переопределить валюту языкового стандарта NumberFormat:
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
//the user may have selected a different currency than the default for their locale
Currency currency = Currency.getInstance("GBP");
numberFormat.setCurrency(currency);
numberFormat.format(amount);
Ответ 3
Что делать, если код валюты равен EUR? И, хотя это произошло, доллар по-прежнему используется во всем мире. Вывод локали из кода валюты кажется ненадежным. Можете ли вы ввести явное предпочтение пользователя для локали вместо этого?
Информация, которую вы ищете, не является частью встроенной базы данных Java-валюты, поэтому для нее нет API. Вы можете создать свою собственную таблицу для многих случаев, которые недвусмысленны.
Ответ 4
Я бы сказал, что если ваша база данных хранит валютную ценность, она должна быть висит на устройствах одновременно. Похоже, вы делаете это сейчас. Можете ли вы добавить локаль в базу данных одновременно? Может быть достойным решением.
Ответ 5
Здесь можно определить локаль из кода валюты
let locale = NSLocale(localeIdentifier: NSLocale.canonicalLocaleIdentifierFromString(NSLocale.localeIdentifierFromComponents([NSLocaleCurrencyCode: currencyCode])))
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.currencyCode = currencyCode
formatter.locale = locale
formatter.maximumFractionDigits = 2
formatter.stringFromNumber(number)