Android - Wie erlauben nur eine bestimmte Anzahl von Dezimalstellen
Kennen Sie eine Methode, um sicherzustellen, dass Benutzer können nur geben Sie zahlen mit einer maximalen Anzahl von Dezimalstellen.
Ich bin nicht sicher, wie dieses problem zu beheben. In der MS SQL Datenbank werde ich senden von Daten von meiner app habe ich Spalten mit dieser Art decimal(8,3)
Nun in Anbetracht der Datentyp der Spalte, die endlich um den Wert zu speichern, die ich überprüfen möchten in Android habe ich mir überlegt diese beiden Fälle:
- Wenn der Benutzer eine Zahl ohne Dezimalstellen, die die maximale Anzahl der Ziffern muss 8
- Wenn der Benutzer eine Zahl mit Dezimalstellen, die maximale Anzahl der Ziffern muss 8 (einschließlich der Ziffern rechts vom Dezimalkomma)
Nun ich bin mir sicher, dass über den ersten Fall, aber nicht so viel über die zweite. Ist es richtig und halten Sie die maximale Anzahl von Ziffern fest(z.B. immer 8)? Oder sollte ich beachten Sie dass Sie maximal 8 Ziffern Links und 3 rechts vom Dezimalpunkt?
Entweder Weg dies ist, was ich versucht habe, in Android:
mQuantityEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
String str = mQuantityEditText.getText().toString();
DecimalFormat format = (DecimalFormat) DecimalFormat
.getInstance();
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();
char sep = symbols.getDecimalSeparator();
int indexOFdec = str.indexOf(sep);
if (indexOFdec >= 0) {
if (str.substring(indexOFdec, str.length() - 1).length() > 3) {
s.replace(0, s.length(),
str.substring(0, str.length() - 1));
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
});
Obwohl der obige code behandelt die maximale Anzahl von Dezimalstellen. Es begrenzt nicht die Gesamtzahl der zulässigen stellen in der EditText.
Glauben Sie, Sie könnten mir helfen, zu verbessern meinen code so, dass es behandelt sowohl die maximale Anzahl der Nachkommastellen und die Anzahl der zulässigen stellen in einem EditText (wenn man beide zahlen Links und rechts neben dem Dezimalpunkt)
BEARBEITEN
Gut, jetzt versuche ich das, was João Sousa vorgeschlagen, und hier ist, was ich versucht habe:
1) I definiert eine Klasse, die InputFilter
public class NumberInputFilter implements InputFilter {
private Pattern mPattern;
public NumberInputFilter(int precision, int scale) {
String pattern="^\\-?(\\d{0," + (precision-scale) + "}|\\d{0," + (precision-scale) + "}\\.\\d{0," + scale + "})$";
this.mPattern=Pattern.compile(pattern);
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned destination, int destinationStart, int destinationEnd) {
if (end > start) {
//adding: filter
//build the resulting text
String destinationString = destination.toString();
String resultingTxt = destinationString.substring(0, destinationStart) + source.subSequence(start, end) + destinationString.substring(destinationEnd);
//return null to accept the input or empty to reject it
return resultingTxt.matches(this.mPattern.toString()) ? null : "";
}
//removing: always accept
return null;
}
}
2) Versucht, verwenden Sie die Klasse wie folgt aus :
mQuantityEditText.setFilters(new InputFilter[] { new NumberInputFilter(8,3)} );
- mögliche Duplikate von Android - Runde auf 2 Dezimalstellen
- Sorry, aber ich werde jetzt nicht die Runde hier nichts, nur beschränken Sie die Anzahl der Dezimalstellen ein Benutzer eingeben kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde für ein filter in den text Bearbeiten, sich selbst mit der macht der regex. Zuerst die regex-Ausdruck:
Vielleicht gibt es mehrere Möglichkeiten, um diese zu verbessern, Ausdruck, aber das bedeutet trick.
Und jetzt setzen Sie einfach einen input-filter in den edittext, wie diese:
Btw, ich habe gerade getestet dieser code und was es tut ist:
Habe ich das richtig verstehe das problem, das Sie beschrieben?
-- EDIT
Ok, ich war fast da. Von dem was ich verstehe -, decimal(8,3) bedeutet, dass höchstens 8 Ziffern einschließlich der Ziffern, die Links oder rechts von der Dezimalstelle, angefangen von
-99999.999
zu99999.999
.Mindestens das ist, was ich verstehe aus diesem Satz
Standard SQL requires that DECIMAL(5,2) be able to store any value with five digits and two decimals, so values that can be stored in the salary column range from -999.99 to 999.99
. Obwohl es von der MySQL-Dokumentation der MSSQL-docs scheinen das gleiche zu tun.decimal(8,3)
-99999.999
zu99999.999
. Ich denke immer noch, diese Lösung ist die beste, da es jetzt nur noch eine Frage der Feinabstimmung der reguläre Ausdruck, wenn nötig.decimal(8,3)
nur maximal 8 Ziffern keine Rolle, ob die Zahl Nachkommastellen hat oder nicht. Having said, die, ich Schätze mal, die regex sollte so etwas wie dieses:^\-?(\d{0,8}|\d{0,5}\.\d{0,3})$
String pattern="^\\-?(\\d{0," + (precision-scale) + "}|\\d{0," + (precision-scale) + "}\\.\\d{0," + scale + "})$";
Habe ich answser für Sie, ich litt auch sehr viel in dieser Art von situation.:D 😛
Ich umgesetzt haben, ist diese für maximal 4 Ziffern Links und 2 rechts der Dezimalpunkt ex: 4444.99
so kleine änderungen implementieren müssen, was ich getan habe:
Tun müssen Sie folgende änderungen
1) Kopie CustomTextWatcher.java zu track-Eingang des editText.
2) setzen Sie diese Klasse, um überprüfen Sie Ihre editText durch folgende.
Hoffe, Sie können konvertieren mein code nach Ihrem Bedarf.
Das problem, das Sie beschreiben, ist genau das, was ein Maskierte EditText ist gedacht für. 🙂
<br.com.sapereaude.maskedEditText.MaskedEditText>
wird nicht erkannt, auch nicht wenn ich es ändern um den Namen von mein Paket.<com.ss.quicorder.maskedEditText.MaskedEditText>