¿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.

usuario1082964
fuente

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

el-jengibre-friki
fuente
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));
Sandeep
fuente
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);
}
YLS
fuente
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
Codificado
fuente
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");
Kush
fuente
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

        }
    });
Eldhose M Babu
fuente
1

Puede utilizar Numberformat

public static double getNumberByString(String s) throws ParseException {
    return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}
Uñas Shaykhraziev
fuente
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));
}
Atiar Talukdar
fuente