String.format использует запятую вместо точки
Мое приложение работает на многих устройствах без проблем до сих пор. Но теперь я получил свою новую Galaxy Tab с Android 3.2, где он постоянно падает. Я узнал, что проблема была в плагине в EditText.
Я использую myEditText.setText(String.format("%.1f", fMyFloat));
, чтобы поместить float в EditText. Но каким-то образом float на моей 3.2 Galaxy Tab генерируется с запятой, а не точкой. Когда я прочитаю EditText, приложение, конечно, аварийно скажет мне, что это не допустимый float из-за запятой...
Что здесь происходит?
Ответы
Ответ 1
Преобразовать float в строку..
Из документации String.format
:
String.format(String format, Object... args)
Возвращает локализованную форматированную строку, используя предоставленный формат и аргументы, используя языковой стандарт по умолчанию.
Приведенный выше текст означает, что вывод String.format
будет соответствовать языку по умолчанию, который использует пользователь.
В качестве примера запятая будет использоваться в качестве разделителя десятичной точки, если она использует пользовательский язык Швеции, но точку, если она использует американский.
Если вы хотите принудительно использовать то, какой язык будет использоваться, используйте перегрузку String.format
, которая принимает три параметра:
Преобразовать строку в float..
Разбор произвольной строки в float с использованием стандартного языкового стандарта довольно прост, все, что вам нужно сделать, это использовать DecimalFormat.parse
.
Затем используйте .parse
, чтобы получить Number
и вызовите floatValue
в этом возвращенном объекте.
Ответ 2
String.format
использует локаль, в которой вы находитесь. Вы должны сделать что-то вроде этого, если хотите точку:
NumberFormat formatter = NumberFormat.getInstance(Locale.US);
myEditText.setText(formatter.format(fMyFloat);
Посмотрите NumberFormat
для получения дополнительных параметров форматирования
Ответ 3
Ваш вызов format
на вашем Galaxy Tab использует по умолчанию Locale
, который, в свою очередь, использует ,
для поплавков. Вы можете использовать String.format(Locale,String,...)
версию с определенной локалью, чтобы заставить все работать.
Или вы должны использовать ту же локаль как для синтаксического анализа, так и для форматирования числа. Поэтому вы должны, вероятно, пойти с NumberFormat
для форматирования и анализа ваших поплавков.
Ответ 4
Используйте ниже код, который он работает для меня:
NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());