Wie kann ich eine String-Nummer so formatieren, dass im Android-Bearbeitungsfeld Kommas stehen?

76

Für welche Funktion kann ich in Android die Nummer in verschiedenen Formaten anzeigen.

Zum Beispiel: Wenn ich 1000 eingebe, sollte es wie diese 1000 angezeigt werden. Wenn ich 10000 eingebe, sollte es wie diese 10.000 angezeigt werden. Wenn ich 1000000 eingebe, sollte dies wie folgt angezeigt werden: 1.000.000.

Bitte führen Sie mich.

user1082964
quelle

Antworten:

159

Sie können DecimalFormatdie Nummer verwenden und einfach formatieren

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

Das Ergebnis wird sein

  • 1,000,000 für 1000000
  • 10,000 für 10000
  • 1,000 für 1000

Update 12/02/2019

Dies String.format("%,d", number)wäre eine bessere (weniger fest codierte) Lösung, wie in den Kommentaren unten von @DreaminginCode angegeben, daher dachte ich, ich würde sie hier als Alternative hinzufügen

der-Ingwer-Geek
quelle
aber wenn ich 100000 eingebe, werden 100.000 angezeigt, stattdessen brauche ich diese 1,00,000, ist es möglich?
user1082964
5
Warum willst du das tun? 100.000 sind Standard. Versuchen Sie, das Komma im Hash-Format wie folgt zu verschieben: #, ##, ###. Ich weiß nicht, ob es funktionieren wird, aber Sie können es versuchen.
-Ginger-Geek
3
@Neil, der Standard gilt nur für bestimmte Länder. Wie zum Beispiel hat Indien einen anderen Standard und hat das Format #, ##, ###
Goedphishing
7
Es beantwortet die Frage, aber die Beantwortung einer Frage macht sie nicht automatisch zu einer guten Antwort. Und wenn die Informationen nicht ausreichen, sollte man als Programmierer meiner Meinung nach weniger statt mehr annehmen. Antworten, die Hardcodierung verwenden, können leicht brechen, wenn sich Annahmen ändern. In diesem Fall ist Hardcodierung besonders schlecht für jeden i18n-bezogenen Code, da es immer zukünftige Leute geben kann, die versuchen, i18n hinzuzufügen, und es wäre ihr WTF-Moment. Ganz zu schweigen davon, dass nur eine größere Anzahl dies brechen kann. Für eine viel einfachere Lösung hätten Sie eine String.format("%,d", number)kurze und korrekte verwenden können
Hai Zhang
1
Kann ich eine Dezimalstelle wie 1.000.000,50 hinzufügen? Oder 1M.50? @ Neil
Leon Zaii
44

Versuchen Sie dieses eine Hoffnung, es wird helfen.

 System.out.println(NumberFormat.getNumberInstance(Locale.US).format(1000));
Sandeep
quelle
4
Um sicher zu gehen, sollten Sie wahrscheinlich das Gebietsschema des Geräts verwenden, nicht immer US. Gebietsschema current = getResources (). GetConfiguration (). Locale;
Matt
5
Locale.getDefault () ist eine noch einfachere Möglichkeit, das Gebietsschema des Geräts abzurufen.
Gober
3
Gemäß der Java-Dokumentation verwenden parameterlose get...Instance()Methoden standardmäßig das Standardgebietsschema.
Juan De la Cruz
11
private String getFormatedAmount(int amount){
  return NumberFormat.getNumberInstance(Locale.US).format(amount);
}
YLS
quelle
6
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));
}

AUSGABE

1
10
100
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000
Codeversiert
quelle
4

Fügen Sie diese Funktion in der allgemeinen Klasse hinzu

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

Und nutzen Sie diese Funktion überall so:

String newNumber = Utils.getFormatedNumber("10000000");
Kush
quelle
2

Fügen Sie wie folgt einen Listener für Textänderungen hinzu (Stellen Sie außerdem sicher, dass der für Edittext ausgewählte Eingabetyp "Nummer" ist):

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
quelle
1

Sie können das Zahlenformat verwenden

public static double getNumberByString(String s) throws ParseException {
    return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}
Nagel Shaykhraziev
quelle
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
quelle