¿Cómo puedo formatear un número de cadena para que tenga comas en el campo de edición de Android?


78

¿Para qué función puedo usar en Android para mostrar el número en diferentes formatos?

Por ejemplo: si ingreso 1000, entonces debería mostrarse así 1,000. Si ingreso 10000, entonces debería mostrarse como este 10,000. Si ingreso 1000000, entonces debería mostrarse así 1,000,000.

Por favor guíame.

Respuestas:


163

Puede usar DecimalFormaty simplemente formatear el número

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

El resultado sera

  • 1,000,000 por 1000000
  • 10,000 por 10000
  • 1,000 por 1000

Actualización 12/02/2019

Esta String.format("%,d", number)sería una solución mejor (menos codificada) como se indica en los comentarios a continuación por @DreaminginCode, así que pensé en agregarla aquí como alternativa


pero si ingreso 100000, muestra 100,000 en su lugar, necesito así 1,00,000, ¿es posible?
user1082964

5
¿Por qué querrías hacer eso? 100.000 es estándar. Intente mover la coma en formato hash como este #, ##, ###. No sé si funcionará, pero puedes intentarlo.
the-ginger-geek

3
@Neil, el estándar solo es válido para países específicos. Como, por ejemplo, India tiene un estándar diferente y tiene el formato #, ##, ###
gophishing

7
Responde la pregunta, pero responder una pregunta no la convierte automáticamente en una buena respuesta. Y cuando la información es insuficiente, creo que uno, como programador, debería asumir menos en lugar de más. Las respuestas que usan codificación rígida pueden romperse fácilmente cuando cambian las suposiciones, y en este caso la codificación rígida es especialmente mala para cualquier código relacionado con i18n porque siempre puede haber personas en el futuro que intenten agregar i18n y ese sería su momento wtf. Sin mencionar que incluso un número mayor puede romper esto. Para una solución mucho más simple, podría haber usado una String.format("%,d", number)que sea corta y correcta
Hai Zhang

1
¿Puedo agregar un decimal detrás como 1,000,000.50? ¿O 1M.50? @Neil
Leon Zaii

44

prueba este espero que te ayude.

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

4
Para estar seguro, es probable que desee utilizar la configuración regional del dispositivo, no siempre EE. UU. Locale current = getResources (). GetConfiguration (). Locale;
Matt

5
Locale.getDefault () es una forma aún más fácil de obtener la configuración regional del dispositivo.
Gober

3
Según la documentación de Java , los get...Instance()métodos sin parámetros utilizan la configuración regional predeterminada de forma predeterminada.
Juan De la Cruz

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

SALIDA

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

4

Agregue esta función en la clase común

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

Y usa esa función en todas partes así:

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

2

Agregue un oyente de cambio de texto como se muestra a continuación (también asegúrese de que el tipo de entrada seleccionado para Editar texto sea Número):

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

Puede utilizar 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));
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.