Android: парсинг валюты ЕС в число - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть EditText, который должен работать следующим образом (Android 2.3.3):

Пользователь вводит, например, 10,40 (что составляет 10 евро и 40 центов в валюте ЕС) - я хочу затемвозьмите этот ввод String и преобразуйте его, например, в BigDecimal (или Number и т. д.), для дальнейших внутренних вычислений.

То же самое должно работать, если пользователь вводит 10.40 (что - в случае доллара США)будет стоить 10 долларов и 40 центов), затем возьмете этот строковый вход и преобразует его, например, в BigDecimal (или число и т. д.).

Я попробовал следующее (основываясь на ответе Майкла Петротты here ), который не работает с "ParseException: Unparsable Number 10,40):

    // German input
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.GERMANY);
    // User input
    String value = "10,40";
    Number valueParsed = formatter.parse(value);

Я также попытался" 10,40 € ", но безрезультатно. Так что я либо неправильно понимаю цельNumberFormat.parse или я на неправильном пути все вместе ...? Я действительно хочу избегать использования регулярных выражений для замены запятой в "10,40" для версии, которая должна работать на международном уровне, и я хотел бы немного чистой, Locale-bAsed подход.

РЕДАКТИРОВАТЬ

Я нашел этот вопрос , который решает ту же проблему - правильный ответ использует тот же подход, что и я, поэтому я попытался снова (используя Франциюв качестве локали на этот раз), но, тем не менее, он терпит неудачу, что выглядит довольно странно ... Комментарий под ссылочным вопросом предложил использовать replaceAll (",", "."), что мне кажется плохой идеей, поскольку некоторые валюты используют запятуюкак разделитель для тысяч, например, доллар США, если я не ошибаюсь.Я мог бы, однако, проверить локаль, но швы затенены :( и потенциально ошибочны ...

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Кажется, вам не нужен формат валюты. Используйте NumberFormat.getNumberInstance() вместо:

String value = "10,40";
double d = (Double)NumberFormat.getNumberInstance().parse(value);
BigDecimal price = new BigDecimal(d);

Это выдаст NumberFormatException, хотя в случае, если пользователь введет значение в формате, неподходящем для его локали (например, "10,40" для США), но должно работать в обычном случае.

1 голос
/ 28 декабря 2011

В вашей строке отсутствует обозначение валюты для этого языкового стандарта.

например, для обозначения валюты Германии - €

вместо введенных пользователем данных должно быть String value = "10,40 €";из String value = "10,40"

Следующий пример отлично работает

NumberFormat formatter1 = NumberFormat.getCurrencyInstance(Locale.GERMANY);
            // User input
            String value = "10,40 €";
            Number valueParsed = formatter1.parse(value);
            System.out.println(valueParsed);
0 голосов
/ 28 декабря 2011

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

Strip everything but numbers and separators.

If there is a separator on the third place from the right?
 Strip all separators and you have the desired amount in cents
Else
 Strip all separators, multiply by 100 and you have the desired amount in cents
...