Як я можу відформатувати номер рядка, щоб у полі редагування android були коми


78

Для якої функції я можу використовувати в android для відображення числа в різні формати.

Наприклад: Якщо я вводжу 1000, то він повинен відображатись приблизно так 1000. Якщо я вводжу 10000, то він повинен виглядати приблизно так 10000. Якщо я вводжу 1000000, то воно повинно відображатися приблизно так 1000000.

Будь ласка, скеруй мене.

Відповіді:


163

Ви можете використовувати DecimalFormatі просто відформатувати номер

DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);

Результат буде

  • 1,000,000 за 1000000
  • 10,000 за 10000
  • 1,000 за 1000

Оновлення 02.02.2019

Це String.format("%,d", number)було б кращим (менш жорстко закодованим) рішенням, як зазначено в коментарях нижче @DreaminginCode, тому я думав, що додам його тут як альтернативу


але якщо я вводжу 100000, то натомість відображається 100000, мені потрібно приблизно 1 000 000, чи можливо це?
user1082964

5
Чому ви хочете це зробити? 100 000 - це стандарт. Спробуйте перемістити кому у форматі хешу, як #, ##, ###. Не знаю, чи це спрацює, але ви можете спробувати.
the-ginger-geek

3
@Neil, стандарт діє лише для певних країн. Як, наприклад, Індія має інший стандарт і має формат #, ##, ###
gonephishing

7
Він відповідає на запитання, але відповідь на запитання не автоматично робить його гарною відповіддю. І коли інформації недостатньо, я вважаю, що програміст повинен вважати менше, а не більше. Відповіді, що використовують жорстке кодування, можуть легко зламатись, коли припущення змінюються, і в цьому випадку жорстке кодування особливо погано для будь-якого коду, пов'язаного з i18n, оскільки завжди можуть бути майбутні люди, які намагаються додати i18n, і це буде їхній момент wtf. Не кажучи вже про те, що просто більша кількість може це зламати. Для набагато простішого рішення ви могли б використати String.format("%,d", number)коротке і правильне
Хай Чжан,

1
Чи можу я додати десяткове відставання, наприклад, 1 000 000,50? Або 1М.50? @Neil
Leon Zaii

45

спробуйте це, сподіваюся, це допоможе.

 System.out.println(NumberFormat.getNumberInstance(Locale.US).format(1000));

4
Для безпеки ви, швидше за все, захочете скористатися мовою пристрою, не завжди США. Локальний струм = getResources (). GetConfiguration (). Locale;
Matt

5
Locale.getDefault () - ще простіший спосіб отримати локаль пристрою.
Гобер

3
Згідно з документацією Java , безпараметричні get...Instance()методи використовують стандартну локаль за замовчуванням.
Хуан Де ла Круз,

11
private String getFormatedAmount(int amount){
  return NumberFormat.getNumberInstance(Locale.US).format(amount);
}

7
int[] numbersToFormat = new int[]
  { 1, 10, 100, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };


for (int number : numbersToFormat) {
  System.out.println(  
    NumberFormat.getNumberInstance(Locale.getDefault()).format(number));
}

ВИХІД

1
10
100
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000

4

Додайте цю функцію до загального класу

  public static String getFormatedNumber(String number){
        if(!number.isEmpty()) {
            double val = Double.parseDouble(number);
            return NumberFormat.getNumberInstance(Locale.US).format(val);
        }else{
            return "0";
        }
    }

І використовуйте цю функцію скрізь так:

String newNumber = Utils.getFormatedNumber("10000000");

2

Додайте пристрій для прослуховування тексту, як показано нижче (Також переконайтесь, що для введення тексту, вибраного для Edittext, вибрано Number):

etTest.addTextChangedListener(new TextWatcher() {

        boolean isManualChange = false;

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (isManualChange) {
                isManualChange = false;
                return;
            }

            try {
                String value = s.toString().replace(",", "");
                String reverseValue = new StringBuilder(value).reverse()
                        .toString();
                StringBuilder finalValue = new StringBuilder();
                for (int i = 1; i <= reverseValue.length(); i++) {
                    char val = reverseValue.charAt(i - 1);
                    finalValue.append(val);
                    if (i % 3 == 0 && i != reverseValue.length() && i > 0) {
                        finalValue.append(",");
                    }
                }
                isManualChange = true;
                etTest.setText(finalValue.reverse());
                etTest.setSelection(finalValue.length());
            } catch (Exception e) {
                // Do nothing since not a number
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

1

Ви можете використовувати Numberformat

public static double getNumberByString(String s) throws ParseException {
    return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}

1
public static String formatNumber(int number){
    return NumberFormat.getNumberInstance(Locale.getDefault()).format(number);
}
public static String formatNumber(String number){
    return NumberFormat.getNumberInstance(Locale.getDefault()).format(Integer.parseInt(number));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.