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());